Всем привет, я тут новенький) и привела меня сюда одна проблемка)) у меня есть шлем железного человека, и я хотел бы сделать открывающуюся переднюю часть, называется забрало) и для этого у меня все есть. Но проблема в скейтче, я его как бы сделал, но что то не так, не могли бы вы посмотреть на скейтч и подсказать мне в чем проблема, но исправлять не нужно) я сам хочу додумать, просто наведите на путь истинный) Еще не сказал суть, когда кнопку нажимаю, забрало должно открыться, когда повторно нажимаю, закрыться. Можно сделать так, когда кнопку нажал, затем отпустил, забрало открылось, опять нажал, отпустил, оно закрылось. Так вот сам скейтч #include <Servo.h> Servo myServo1; Servo myServo2; int switchPin = 2; int flag = 0; void setup() { pinMode(switchPin, INPUT); myServo1.attach(8); myServo2.attach(5); myServo1.write(150); myServo2.write(50); } void loop() { if(digitalRead(switchPin) == HIGH && flag == 0) { myServo1.write(50); myServo2.write(150); flag = 1; } if(digitalRead(switchPin) == LOW && flag == 1) { myServo1.write(150); myServo2.write(50); flag = 0; } } где синим отмечено, там что то не правильно, не могу понять как сделать и вот схему тоже посмотрите)
В электронике практически не разбираюсь (жизнь еще не заставила). Просто, всегда повторяю по примерам, подключение кнопки - http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku или тут, здесь получше видно - https://www.arduino.cc/en/Tutorial/Button. Пояснить, почему именно так, не смогу. По коду. Что у Вас происходит, при 1 нажатии кнопки, мы падаем в if(digitalRead(switchPin) == HIGH && flag == 0). Как только упали, выполнили команды и присвоили flag 1. После, даже если держим ни чего не происходит. Как только отпустили упали в if(digitalRead(switchPin) == LOW && flag == 1). Данная техника, позаимствована из примера, по из указных мной ссылке. Вот только там инвертирование и все отлично работает. В первом if digitalWrite(13,!digitalRead(13)); А во втором, просто обнуление flag. Самый простой вариант, заведите переменную и при каждом нажатии, увеличивайте ее на 1-цу, а дальше проверяйте, если 1 - открыть, если 2 - закрыть и обнулить переменную. Затем можно усложнить, нажали и пока не отпустили не открывается. Далее еще сложнее, оставить if как есть и менять значение через функцию. Так же рекомендую посмотреть на форуме рекомендации по книгам. Если, не решите, можете посмотреть готовый ответ тут. Удачи. UPD. Да по готовому ответу, 1 пост, последний блок кода.
Спасибо за совет, попробую сделать еще одну переменную, но чуть позже, сейчас дела, как сделаю, отпишусь) может видео сниму)) готовый ответ пока не смотрел)
Код (Text): void loop() { if(digitalRead(switchPin)) { if (flag) { myServo1.write(150); myServo2.write(50); } else { myServo1.write(50); myServo2.write(150); } flag = !flag; while (digitalRead(switchPin)); } }
Итак, есть одна проблема, 2 сервопривода, не хотят хорошо работать с одной кроны, ибо они начинают трястись, издавать звуки. Подсоединил один к ардуино, работает хорошо, без всяких звуков. О скейтче, сделал скейтч который мне скинули, хотел проверить работает он или нет)) так и оставил его) но надо еще доработать на дребезги, иногда серво туда и обратно поворачивается за один клик. Итог: купить еще одну крону, доделать скейтч, но я его не смогу доделать, т.к. я в нем вообще не разобрался)
void loop() { if(digitalRead(switchPin)) { if (flag) { myServo1.write(50); myServo2.write(150); delay (500); } else { myServo1.write(150); myServo2.write(50); delay (500); } flag = !flag; while (digitalRead(switchPin)); } } вот теперь класс)) работает как надо)
почитайте и узнаете как ПРАВИЛЬНО подключать серву и как ею управлять http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-servo-posmotri-tut