ДУ пульт и ИК-приёмник есть в большинстве стартовых наборах ардуино. Также эти компоненты очень легко найти. А настраивать и мучиться с конденсаторами не надо. В отличие от радиомодулей на практике от помех по питанию скорее рестартниться ардуино , чем прийдут неверные данные. Вообщем сделал вот такую машинку : На фотографиях можно увидеть что контроллера два . Второй - Wavgat Nano , на нём я отрабатываю передачу данных ик способом уже с одной ардуино на другую. На последнем фото советский конденсатор ЭТО 72 года на 30 мкФ. Ёмкость хоть какая-то есть ,но напряжение с него быстро падает даже на мегаомном вольтметре. Ультразвуковой датчик стоит , но но подключать пока руки не дошли. Также изначально китайский лазер крутился на шаговом моторе , но его усилия не хватало , поэтому поставил сервомашинку а драйвкр остался. Сам лазер поставил для большей наглядности работы сервоприводов. Код таков: Спойлер: код Код (C++): #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); #include "IRremote.h" IRrecv irrecv(8); decode_results results; #include <Stepper_28BYJ.h> #define STEPS 4078 Stepper_28BYJ stepper(STEPS, 3, 4, 5, 6); #include <Servo.h> Servo servoV;//вертикаль Servo servoRul; bool laser = 0; int i ; byte led = 1; unsigned long time_trand = 0, st = 0; int ss = 90 , gs = 90, trend = 0; #define in1 3 #define in2 4 #define in3 5 #define in4 6 #define dl 5 // пусть крутится быстро!!! #define srok 4000 #define ch_minus 0xFFA25D #define ch 0xFF629D #define ch_plus 0xFFE21D #define vol_minus 0xFFE01F #define vol_plus 0xFFA857 #define prev 0xFF22DD #define next 0xFF02FD #define play_pause 0xFFC23D #define eq 0xFF906F const unsigned long key[] = { 0xFF6897, //0 0xFF30CF, //1 0xFF18E7, //2 0xFF7A85, //3 0xFF10EF, //4 0xFF38C7, //5 0xFF5AA5, //6 0xFF42BD, //7 0xFF4AB5, //8 0xFF52AD, //9 0xFF9867, //100+ 0xFFB04F //200+ }; void setup() { Serial.begin(9600); Serial.print("startyem"); stepper.setSpeed(300); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); pinMode(7, OUTPUT); servoV.attach(9); servoRul.attach(10); mySwitch.enableTransmit(11); pinMode(13, OUTPUT); irrecv.enableIRIn(); attachInterrupt(0, wall, FALLING); } void loop() { if ( irrecv.decode( &results )) { Serial.println(results.value, HEX); if (results.value == key[5]) { digitalWrite( A0, 0 ); digitalWrite( A1, 0 ); digitalWrite( A2, 0 ); digitalWrite( A3, 0 ); } else if (results.value == key[2]) { go(); } else if (results.value == key[8]) { back(); } else if (results.value == key[4]) { left(); } else if (results.value == key[6]) { rihgt(); } else if (results.value == vol_minus) { trend = 1 ; if (millis() > (time_trand + srok) && trend == 1 || trend != 1) { time_trand = millis(); } gs = gs - 1; gs = constrain(gs, 0, 180); servoRul.write(gs); } else if (results.value == vol_plus) { trend = 2 ; if (millis() > (time_trand + srok) && trend == 2 || trend != 2) { time_trand = millis(); } gs = gs + 1; gs = constrain(gs, 0, 180); servoRul.write(gs); } else if (results.value == prev) { trend = 1 ; if (millis() > (time_trand + srok) && trend == 1 || trend != 1) { time_trand = millis(); } //stepp(50); stepper.step(50); } else if (results.value == next) { trend = 2 ; if (millis() > (time_trand + srok) && trend == 2 || trend != 2) { time_trand = millis(); } //stepp(-50); stepper.step(-50); } else if (results.value == ch_plus) { trend = 3 ; if (millis() > (time_trand + srok) && trend == 3 || trend != 3) { time_trand = millis(); } ss = ss + 1; ss = constrain(ss, 0, 180); servoV.write(ss); } else if (results.value == play_pause) { trend = 4 ; if (millis() > (time_trand + srok) && trend == 4 || trend != 4) { time_trand = millis(); } ss = ss - 1; ss = constrain(ss, 0, 180); servoV.write(ss); } else if (results.value == key[11]) { trend = 5 ; if (millis() > (time_trand + srok) && trend == 5 || trend != 5) { time_trand = millis(); } ss = ss + 1; ss = constrain(ss, 0, 180); servo(9, ss); } else if (results.value == key[10]) { trend = 6 ; if (millis() > (time_trand + srok) && trend == 6 || trend != 6) { time_trand = millis(); } ss = ss - 1; ss = constrain(ss, 0, 180); servo(9, ss); } else if (results.value == 0xFFFFFFFF && millis() < (time_trand + srok)) { switch (trend) { case 0: break; case 1: //stepp(50); gs = gs - 3; gs = constrain(gs, 0, 180); servoRul.write(gs); break; case 2: //stepp(-50); gs = gs + 3; gs = constrain(gs, 1, 180); servoRul.write(gs); break; case 3: ss = ss + 3; ss = constrain(ss, 1, 180); servoV.write(ss); break; case 4: ss = ss - 3; ss = constrain(ss, 0, 180); servoV.write(ss); break; case 5: ss = ss + 3; ss = constrain(ss, 0, 180); servo(9, ss); break; case 6: ss = ss - 3; ss = constrain(ss, 0, 180); servo(9, ss); break; } } else if (results.value == eq) { switch (led) { case 1: digitalWrite( 7, 1 ); led = 2; break; case 2: digitalWrite( 7, 0 ); led = 1; break; } } else if (results.value == ch) { /*switch (laser) { case 0: digitalWrite( 13, 1 ); laser = 1; mySwitch.send(5393, 24); delay(1000); break; case 1: digitalWrite( 13, 0 ); laser = 0; break; }*/ mySwitch.send(B0100, 4); delay(1000); mySwitch.send(B1000, 4); delay(1000); } irrecv.resume(); } } int stepp(int shag) { if (shag > 0) { i = shag; while ( i != 0) { digitalWrite( in1, HIGH ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(dl); i--; } } else { i = shag; while ( i != 0) { digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, HIGH ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(dl); i++; } } } int servo(byte port, byte pos) { for (int i = 1; i <= 180; i++) { digitalWrite(port, HIGH); delayMicroseconds(pos); digitalWrite(port, LOW); delayMicroseconds(20000 - pos); delay(1); } //digitalWrite(servo, LOW); } void wall() { if (st < millis() - 1000) { //back(); //delay(5); digitalWrite( A0, 0 ); digitalWrite( A1, 0 ); digitalWrite( A2, 0 ); digitalWrite( A3, 0 ); st = millis(); } } void go() { digitalWrite( A0, 0 ); digitalWrite( A1, 1 ); digitalWrite( A2, 0 ); digitalWrite( A3, 1 ); } void back() { digitalWrite( A0, 1 ); digitalWrite( A1, 0 ); digitalWrite( A2, 1 ); digitalWrite( A3, 0 ); } void left() { digitalWrite( A0, 1 ); digitalWrite( A1, 0 ); digitalWrite( A2, 0 ); digitalWrite( A3, 1 ); } void rihgt() { digitalWrite( A0, 0 ); digitalWrite( A1, 1 ); digitalWrite( A2, 1 ); digitalWrite( A3, 0 ); } Продолжение следует ...
Делаю ик пульт на ардуино , подробнее в этой теме : http://forum.amperka.ru/threads/Контрольная-сумма-пакетов.17460/ Но код там корявый с корявостью кода разбираюсь тут: http://forum.amperka.ru/threads/МК-неправильно-считает.17639/
Пока делал пульт сжёг три китайских потанциометра , но смог найти ошибку в коде . Вместо реле в разрыв после светодиодов поставил pnp трнзистор. Теперь перключаю фары быстро и без щёлкания. Чуть не спалил атмегу (один из пинов оказался замкнут на плюс). Иногда начинают шалить сервоприводы , дёргаться и так далее . И один мотор редуктор проворачивается со стрнным звуком , разбирал ничего странного не обнаружил.
Скачал на телефон приложение , позволяющие передавать видео онлайн . Приделал его на изоленту к самоходу. Картинка хоть и плохого качества , но и так сойдёт. Из поломок : сначала сломался вал-переходник ( он у меня из пластика ) , потом в результате усталости металла сломалась проволочка ( вроде из меди 1мм) крпления вала к колесу.