UNO + MSS Shield + IR = ?
- Войдите на сайт для отправки комментариев
Есть Arduino UNO, MSS Shield, колесная платформа (2 моторчика), IR-приёмник и пульт.
Пытаюсь заставить это всё работать вместе (как машинку с IR-пультом).
По отдельности всё работает:
Скетч отсюда работает отлично: в консоль сыплются значения полученные с приёмника.
Скетч:
/* * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com */ #include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } }
Этот скетч тоже работает:
#include <AFMotor.h> AF_DCMotor motor_a(1, MOTOR12_64KHZ); // create motor #1, 64KHz pwm AF_DCMotor motor_b(2, MOTOR12_64KHZ); void setup() { motor_a.setSpeed(255); motor_b.setSpeed(255); } void loop() { motor_a.run(FORWARD); motor_b.run(FORWARD); delay(5000); motor_a.run(RELEASE); motor_b.run(RELEASE); motor_a.run(FORWARD); motor_b.run(BACKWARD); delay(5000); motor_a.run(RELEASE); motor_b.run(RELEASE); motor_a.run(FORWARD); motor_b.run(FORWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); motor_a.run(BACKWARD); motor_b.run(FORWARD); delay(4000); motor_a.run(RELEASE); motor_b.run(RELEASE); motor_a.run(BACKWARD); motor_b.run(BACKWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); }
Платформа резво (при питании ардуины от кроны) катается.
При подключении приёмника к одному из разъёмов для серв (на шилде. Там они просто подключены к 9 и 10 пинам) первый скетч также работает нормально.
Обьединяю скетчи:
(сделал поддержку сразу 2х пультов)
#include <AFMotor.h> #include <IRremote.h> int RECV_PIN = 9; AF_DCMotor motor_a(1, MOTOR12_64KHZ) AF_DCMotor motor_b(2, MOTOR12_64KHZ); IRrecv irrecv(RECV_PIN); IRsend irsend; decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver motor_a.setSpeed(255); motor_b.setSpeed(255); } void loop() { if (irrecv.decode(&results)){ Serial.println(results.value, HEX); if ((results.value == 0xC9C3741) || (results.value == 0x658E46C4)) { //вперед Serial.println("/|"); motor_a.run(FORWARD); motor_b.run(FORWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } if ((results.value == 0x925D5B5D) || (results.value == 0xD7E5BC84)) { //назад Serial.println("|/"); motor_a.run(BACKWARD); motor_b.run(BACKWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } if ((results.value == 0x1644C1C1) || (results.value == 0x5F934D20)) { //налево Serial.println("<--"); motor_a.run(BACKWARD); motor_b.run(FORWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } if ((results.value == 0xD0529225) || (results.value == 0xCB66B75A)) { //направо Serial.println("-->"); motor_a.run(FORWARD); motor_b.run(BACKWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } irrecv.resume(); // Receive the next value } }
Этот скетч уже работает не полностью:
1) Приёмник шлёт данные в ком-порт
2) В цикле срабатывают if'ы, так как в ком-морт приходят "-->" и т.д.
НО!! никакого влияния на моторы это всё не оказывает.
Куда смотреть, что проверить?
может проблема в таймерах?
http://bigbarrel.ru/irremote-pwm-error/
Сейчас попробую, наверное в этом всё дело, потому что по отдельности работает замечательно.
хм,теперь в приёмник сыплется совсем чушь
UPD: Ура, всё работает, дело действительно было в используемых библиотеками таймерах! :)
Спасибо, noxic!
http://arduino.ru/forum/programmirovanie/motor-shield-v3-podklyuchenie-tsop#comment-22223