Это руководство - как построить еще один бесполезный робот, который предназначен скорее для развлечения, чем для решения логических задач.
На минуту представим себе о вымышленном персонаже, живущем в коробочке. Одно только осознание присутствия его там, пробуждает интерес и желание хоть на секунду заглянуть в его сказочный, никому неизведанный мир.
Игрушка в виде коробочки с тумблером и открывающейся створкой, заключает в себе ряд механических элементов и блок управления на основе Arduino. Для удобства представляем вам 9 шагов для более детального подхода к сборке. Что из этого получиться увидим, когда соберем эту игрушку у себя дома.
Видеопрезентация работы:
Шаг 1: Как это работает?
Вся работа данного устройства, так или иначе, завязана на микропроцессоре Arduino. При переключении тумблера в позицию "Вкл" на корпусе сигнал поступает в плату управления, активирует сервомоторы и приводит их в движение. При этом происходит следующее: створка коробки открывается, оттуда высовывается механическая "рука", переводит переключатель в исходное положение "Выкл", возвращается обратно, створка закрывается. Следующее включение тумблера повторяет работу робота.
Если вы внимательно смотрели видео, при каждом новом нажатии переключателя, устройство реагирует немного по-другому. Это связано с программным кодом, который случайным образом определяет ту или иную модель поведения руки. В зависимости от встроенной памяти Arduino количество ходов может быть столько, сколько вы сами захотите.
Шаг 2: Детали:
Для сборки конструкции вам понадобится:
Коробка:
Любая плата Arduino с PWM выходами.
Два стандартных RC серводвигателя (например, Futaba - S3003 , у них есть 3,2 кг/см крутящего момента, более чем достаточных, чтобы переместить дверь или руку).
6-12 В батареи.
SPTT или SPST переключатель для триггера (в принципе это любой выключатель, который вам понравится).
Выключатель для батареи.
Кнопка для перезагрузки Arduino (restart).
Перемычки и провода.
Дополнительно:
Если вы хотите, чтобы коробочка еще и двигалась (как в видео) вам будут нужны:
Специальная плата для электромотора - Arduino motor shield.
Электромотор постоянного тока (RC серводвигатель) и коробка передач, подходящие практически с любой машинки на радиоуправлении.
Для уменьшения шума и грохота при работе необходимы:
Электролитический конденсатор 10mF
Резистор 10K.
Инвертор (чип 74HC04).
Шаг 3: Построение коробочки:
Для построения коробочки вам понадобится фанера или пробковое дерево, а также сильнодействующий клей для дерева. Учтите, что вес конструкции играет большую роль в нагрузке на сервоприводы и расходе заряда батареи. Размеры коробки 22см x 14см x 14см.
Шаг 4: Схема электрической части:
Верхняя часть:
Основная плата Arduino, 2 сервопривода, переключателя Вкл/Выкл. Обратите внимание, что вы можете заменить часть цепи, отвечающую за уменьшение шума при закрытии крышки и движении руки, на простой резистор.
Сервоприводы питаются непосредственно от контакта 5 на Arduino. Сигнальные провода подключены к контакту 9 и 10 соответственно. Эти контакты поддерживают PWM, что обеспечивает управление углом/положением сервопривода (от 0 до 180 градусов макс). Красная кнопка предназначена для сброса(перезагрузки) платы Arduino.
Нижняя часть:
Для перемещения коробочки на столе в нижней части представлена плата для электромотора - Arduino motor shield. В плате имеются два канала подключения - А или В, поэтому возможно использование сразу двух моторов, при желании. Главное, что этот элемент позволяет задать в программном коде направление, скорость и разрывы для любого из доступных 2 каналов двигателей. По схеме используется канал В, где контакт 13 - для направления, 11 - для скорости и 8 - для управления тормозами.
На схеме аккумулятор 11.1/1000 мА (кстати, такой же как в ARDrone), соединен с платой Arduino motor shield. Если вы не будете использовать ее, можно подключить батарею к основной плате напрямую.
1. крышка серво подключены к PWM контакте 9 2. рука серво подключены к PWM контакте 9 3. схема включения
Шаг 5: Установка сервоприводов:
Методом проб и ошибок необходимо установить сервопривод руки таким образом пока не получите необходимый результат. Вы можете использовать примеры серво-программ (готовые скетчи для движения сервоприводов) в Arduino IDE, что бы проверить величину (градус) отклонения сервоприводов.
Рука делается из любого дерева (чем легче, тем лучше). Ее размеры подбираются в ходе монтирования, что бы получить эффект выключения тумблера управления. Сервопривод и толкатель крышки монтируется так, что бы рука не задевала их в процессе работы.
Шаг 6: Подключение коммутатора и сервоприводов к плате Arduino:
С помощью проводов и перемычек необходимо подключить все соединения, показанные в схеме выше, и попытаться уложить все детали внутри коробки так, чтобы они не мешали работе механических частей.
1. схема включения 2. резинка, чтобы дать некоторую напряженность на открытие и закрытие двери 3. двигатель щит установлен над Arduino
Шаг 7: Установка электромоторов, колес, редуктора, кнопки рестарта и батареи DC:
На днищевой части крепятся аккумулятор, редуктор, электромотор с колесами, тумблер включения и отключения батареи и кнопка перезагрузки микроконтроллера. При монтировании редуктора и электромотора колес необходимо учесть баланс веса коробки, а лишь затем определить место крепежа. По мимо двух ведущих колес следует поместить ось с двумя дополнительными для устойчивого движения робота, как на картинке.
1. кнопка сброса 2. батарейки и главный выключатель питания
Шаг 8: Код:
Чтобы написать код для Arduino установите на свой ПК программу Arduino IDE.
Пример кода приведен ниже. Внимание, значения для отклонения сервоприводов, указанные в коде, предназначены именно для этого коробка, принимая во внимание место расположения сервоприводов, размеры и многое другое. Таким образом, вы должны подобрать свои значения в соответствии с вашими данными
//motor variables int motorThrottle=11; int motorDirection = 13; int motorBrake=8;
int pos = 0; int selectedMove = 0; //move selector int Testmove = 0; //test mode: set to move number to test only one selected move //(set to Zero to run normally i.e: roundrobbin on amm moves)
void setup() { Serial.begin(9600); pinMode(switch_pin, INPUT); doorServo.attach(9); //set door servo on Pin 9 pwm handServo.attach(10); //set hand servo on Pin 10 pwm doorServo.write(80); //set door to hiding position handServo.write(0); //set hand to hiding position
//Setup Channel B, (since Channel A is reserved by door and hand servos and can't ber used at same time) pinMode(motorDirection, OUTPUT); //Initiates Motor Channel B pin pinMode(motorBrake, OUTPUT); //Initiates Brake Channel B pin
//if the switch is on, then move door and hand to switch it off... if(digitalRead(switch_pin) == HIGH) {
if (selectedMove > 10) { selectedMove = 0; } //when all moves are played, repeat the moves from beginning // below are all the "Moves" i designed so far, each is a function that is written below in the code, execuse the names, abit strange? yes as some are written in arabic if (selectedMove == 0) { switchoff(); } else if (selectedMove == 1) { switchoff(); } else if (selectedMove == 2) { switchoffbitaraddod(); } else if (selectedMove == 3) { crazydoor(); } else if (selectedMove == 4) { crazyslow(); } else if (selectedMove == 5) { m7anika7anika(); } else if (selectedMove == 6) { m3alla2(); } else if (selectedMove == 7) { switchoff(); } else if (selectedMove == 8) { matrix(); } else if (selectedMove == 9) { sneak(); } else if (selectedMove == 10) { zee7(); }
if (Testmove == 0) { selectedMove++; //swith to next move if not in test mode }
void zee7() { //Moving door for(pos = 80; pos < 155; pos = 3) { doorServo.write(pos); delay(15); } delay(2000); //forward @ half speed to the left digitalWrite(motorDirection, LOW); //Establishes RIGHT direction of Channel B digitalWrite(motorBrake, LOW); //Disengage the Brake for Channel B analogWrite(motorThrottle, 100); //Spins the motor on Channel B at full speed delay(300); digitalWrite(motorBrake, HIGH); //Eengage the Brake for Channel B delay(2000);
//backward @ half speed to the right digitalWrite(motorDirection, HIGH); //Establishes LEFT direction of Channel B digitalWrite(motorBrake, LOW); //Disengage the Brake for Channel B analogWrite(motorThrottle, 100); //Spins the motor on Channel B at half speed delay(300); digitalWrite(motorBrake, HIGH); //Eengage the Brake for Channel B delay(1000);
Шаг 9: Дополнительный функция - определение движения:
В дополнение, можно снабдить своего робота зрением. Если вы уже построили колеса, чтобы коробка двигалась, остается добавить оптический датчик и внести некоторые изменения в коде для обнаружения движения.
На примере сенсора GP2Y0A21, датчик имеет 3 провода: желтый провод подключается к контакту 3 на Arduino, красный и черный подключены к контакту 5 и к заземлению соответственно. Устанавливается датчик на внутренней стороне створки, что позволяет ему срабатывать лишь тогда, когда она открывается. Предлагаем вашему вниманию код с функцией обнаружения движения (см. код в функции zee7() ), которая позволяет коробке двигаться влево, а затем вправо при приближении к тумблеру человеческой руки. В обновленном коде возможен выбор последовательной или случайнай модели поведения робота путем логической команды Randomize.
1. ИК датчик
#include Servo doorServo; Servo handServo;
unsigned long TimerA,TimerB; //timer for the movement detection routine int switch_pin = 2; //set switch on pin 2
//motor variables int motorThrottle=11; int motorDirection = 13; int motorBrake=8;
//Distance Variables int motionPin = 3; //motion sensor pin on analog 0 int lastDist = 0; //to remember last distance int currentDist = 0; int thresh = 200; //Threshold for Movement (set it such that you get the desired sensetivity of motion detection)
int pos = 0; int selectedMove = 0; //move selector int Testmove = 0; //test mode: set to move number to test only one selected move //(set to Zero to run normally i.e: roundrobbin on all moves) boolean randomize = true; // if true, the box will do movers randomly, if set to false then the moves will be done sequencially from 1 to 10
void setup() { Serial.begin(9600); pinMode(switch_pin, INPUT); doorServo.attach(9); //set door servo on Pin 9 pwm handServo.attach(10); //set hand servo on Pin 10 pwm doorServo.write(80); //set door to hiding position handServo.write(0); //set hand to hiding position //Setup Channel B, since Channel A is reserved by door and hand servos and can't ber used at same time pinMode(motorDirection, OUTPUT); //Initiates Motor Channel B pin pinMode(motorBrake, OUTPUT); //Initiates Brake Channel B pin
}
void loop() {
//if the switch is on, then move door and hand to switch it off... if(digitalRead(switch_pin) == HIGH) {
if (Testmove == 0) {
if(randomize == false) { if (selectedMove > 10) { selectedMove = 0; //when all moves are played, repeat the moves from beginning } } else { selectedMove = random(11); } } else { selectedMove = Testmove; } Serial.println(selectedMove); if (selectedMove == 0) { switchoff(); } else if (selectedMove == 1) { switchoff(); } else if (selectedMove == 2) { switchoffbitaraddod(); } else if (selectedMove == 3) { crazydoor(); } else if (selectedMove == 4) { crazyslow(); } else if (selectedMove == 5) { m7anika7anika(); } else if (selectedMove == 6) { m3alla2(); } else if (selectedMove == 7) { switchoff(); } else if (selectedMove == 8) { matrix(); } else if (selectedMove == 9) { sneak(); } else if (selectedMove == 10) { zee7(); }
if (Testmove == 0 && randomize == false) { selectedMove++; //switch to next move if not in test mode }
Комментарии: