Ви не увійшли.
Собрал машинку с начинкой Ардуино ПРО МИНИ + плата блютуза HC-06 + плата драйвера L298N + 2 DC мотора
Как и положено в таких случаях - в интернете куча разного... с использованием двухколесных китов, есть так же варианты мотор+серво, но вариантов на 2 мотора я не нашел.
Переработал код с сайта RemoteXY - получилось вот такое:
/////////////////////////////////////////////
// RemoteXY include library //
/////////////////////////////////////////////
/* RemoteXY select connection mode and include library */
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600
/* RemoteXY configurate */
unsigned char RemoteXY_CONF[] =
{ 3,0,23,0,1,5,5,15,41,11
,43,43,1,2,0,6,5,27,11,5
,79,78,0,79,70,70,0 };
/* this structure defines all the variables of your control interface */
struct {
/* input variable */
signed char joystick_1_x; /* =-100..100 x-coordinate joystick position */
signed char joystick_1_y; /* =-100..100 y-coordinate joystick position */
unsigned char switch_1; /* =1 if switch ON and =0 if OFF */
/* other variable */
unsigned char connect_flag; /* =1 if wire connected, else =0 */
} RemoteXY;
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
/* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 5
#define PIN_MOTOR_STEERING_DN 4
#define PIN_MOTOR_STEERING_SPEED 10
/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 7
#define PIN_MOTOR_RUNNING_DN 6
#define PIN_MOTOR_RUNNING_SPEED 9
/* defined the LED pin */
#define PIN_LED 13
/* defined two arrays with a list of pins for each motor */
unsigned char SteeringMotor[3] =
{PIN_MOTOR_STEERING_UP, PIN_MOTOR_STEERING_DN, PIN_MOTOR_STEERING_SPEED};
unsigned char RunningMotor[3] =
{PIN_MOTOR_RUNNING_UP, PIN_MOTOR_RUNNING_DN, PIN_MOTOR_RUNNING_SPEED};
/*
speed control of the motor
motor - pointer to an array of pins
v - motor speed can be set from -100 to 100
*/
void setup() {
/* initialization pins */
pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
pinMode (PIN_LED, OUTPUT);
/* initialization module RemoteXY */
RemoteXY_Init ();
}
void loop() {
RemoteXY_Handler ();
// analogRead RemoteXY.joystick_1_y;
// analogRead RemoteXY.joystick_1_x;
int vr = RemoteXY.joystick_1_x;
int vs = RemoteXY.joystick_1_y;
if (vr>0)
{
digitalWrite(RunningMotor[0], HIGH);
digitalWrite(RunningMotor[1], LOW);
analogWrite(RunningMotor[2], vr*2.55);
}
else if (vr<0)
{
digitalWrite(RunningMotor[0], LOW);
digitalWrite(RunningMotor[1], HIGH);
analogWrite(RunningMotor[2], (-vr)*2.55);
}
else
{
digitalWrite(RunningMotor[0], LOW);
digitalWrite(RunningMotor[1], LOW);
analogWrite(RunningMotor[2], 0);
}
if (vs>0) {
digitalWrite(SteeringMotor[0], HIGH);
digitalWrite(SteeringMotor[1], LOW);
analogWrite(SteeringMotor[2], vs*2.55);
}
else if (vs<0) {
digitalWrite(SteeringMotor[0], LOW);
digitalWrite(SteeringMotor[1], HIGH);
analogWrite(SteeringMotor[2], (-vs)*2.55);
}
else {
digitalWrite(SteeringMotor[0], LOW);
digitalWrite(SteeringMotor[1], LOW);
analogWrite(SteeringMotor[2], 0);
}
}
Результат положительный - машинка едет как положено. Но есть трабл. Бесплатная версия RemoteXY работает только 30 сек., а с финансами проблема. Стал искать другие варианты.
Нашел такое https://www.youtube.com/watch?v=46w362K6BDk
Показалось подходящим, но тут используется MotorShieldR3, а у меня его нет. Попробовал перелепить предложенный автором код под мою конфигурацию. Получилось такое:
/*
Front Motor (Steering) => Channel A
Back Motor => Channel B
Since the motor shield hijacks 6 pins for the motors'
control, they are declared in the MotorShieldR3 library.
*/
#include <SoftwareSerial.h>
int bluetoothTx = 2;
int bluetoothRx = 3;
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
/* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 7
#define PIN_MOTOR_STEERING_DN 6
#define PIN_MOTOR_STEERING_SPEED 10
/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 4
#define PIN_MOTOR_RUNNING_DN 5
#define PIN_MOTOR_RUNNING_SPEED 9
/*
#include <MotorShieldR3.h>
MotorShieldR3 yellowCar;*/
#define pinfrontLights 13 //Pin that activates the Front lights.
#define pinbackLights 12 //Pin that activates the Back lights.
char command = 'S';
int v = 250;
int timer0 = millis();
int timer1 = 0;
void setup()
{
//Setup Bluetooth serial connection to android
Serial.begin(115200); //Set the baud rate to that of your Bluetooth module.
pinMode(pinfrontLights , OUTPUT);
pinMode(pinbackLights , OUTPUT);
pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
}
void loop(){
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
if(Serial.available() > 0){
command = Serial.read();
//Change pin mode only if new command is different from previous.
//Serial.println(command);
switch(command){
case 'F':
// yellowCar.Forward_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'B':
// yellowCar.Back_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'L':
// yellowCar.Left_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'R':
// yellowCar.Right_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'S':
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'I': //FR
// yellowCar.ForwardRight_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'J': //BR
// yellowCar.BackRight_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'G': //FL
// yellowCar.ForwardLeft_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'H': //BL
// yellowCar.BackLeft_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'W': //Font ON
digitalWrite(pinfrontLights, HIGH);
break;
case 'w': //Font OFF
digitalWrite(pinfrontLights, LOW);
break;
case 'U': //Back ON
digitalWrite(pinbackLights, HIGH);
break;
case 'u': //Back OFF
digitalWrite(pinbackLights, LOW);
break;
case 'D': //Everything OFF
digitalWrite(pinfrontLights, LOW);
digitalWrite(pinbackLights, LOW);
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
default: //Get velocity
if(command=='q'){
v = 255; //Full velocity
// yellowCar.SetSpeed_4W(velocity);
}
else{
//Chars '0' - '9' have an integer equivalence of 48 - 57, accordingly.
if((command >= 48) && (command <= 57)){
//Subtracting 48 changes the range from 48-57 to 0-9.
//Multiplying by 25 changes the range from 0-9 to 0-225.
v = (command - 48)*25;
// yellowCar.SetSpeed_4W(velocity);
}
}
}
}
else
{
timer0 = millis(); //Get the current time (millis since execution started).
//Check if it has been 500ms since we received last command.
if((timer0 - timer1)>500){
//More tan 500ms have passed since last command received, car is out of range.
//Therefore stop the car and turn lights off.
digitalWrite(pinfrontLights, LOW);
digitalWrite(pinbackLights, LOW);
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
}
}
}
Код компилируется, но моторы двигаться не хотят.
Пожалуйста, помогите найти и исправить ошибку. Или ссылку на рабочий код под мою конфигурацию, если находил кто. Только не отсылайте курить интернет - у меня за пол года от всего этого дыма голова раскалывается уже...
Остання редакція baspav (2016-03-06 10:35:36)
Неактивний
а не пробовали убрать из loop() нафиг
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
Неактивний
Убрал указанное нафиг... результат нулевой. сигнал на моторы не приходит. Хоть бы что "зашуршало, цокнуло"...
Насчет
analogWrite(PIN_MOTOR_............._SPEED, v); - не уверен, а
digitalWrite(PIN_MOTOR_..............., LOW); - по моему, точно не мешает.
Если Вы о случае:
case 'S':
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
- то останавливать машину надо как-то...
если о самой верхней или нижней секции лупа - убрал - без результата.
Остання редакція baspav (2016-03-06 21:37:25)
Неактивний
Не понимаю я готовых решений типа: скопировал, залил - заработало. Программирование дарит человеку 2 радости: 1. Радость понимания того, что ты, и как ты это делаешь (радость самого процесса познания), и 2. Радость, когда всё заработало (т.е. радость победы, и над собой в т.ч.).
СтОит разрисовать и понять схему подключения того, что не работает. И по каждому сигналу разобраться с тем, что и как должно быть подключено и обработано программой. Не нужно валить всё в кучу ради быстрого оргазма. ИМХО.
Неактивний
И все это я прекрасно понимаю, но ((( сколько же вас грамотных и все, наверное самоучки, и учитель у всех - интернет... а я сижу, ничего не делаю, в интернет лезть не хочу... Но с репликами, подобной Вашей, в интернете подсказок больше не становится. А я сажусь заливать в машинку свои куралесы, малый приходит "Дай!" Минут 20 я отговариваюсь, а потом тесты заканчиваются. А принимая во внимание детскую любознательность, в препарированную ребёнком при моём недосмотре машинку заливать что-то будет бессмысленно. )))
Потому и прошу подсказать, куда двигаться.
И еще: есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят (и приходят ли) на неё по зубу? Может не в скетче дело, а в андроиде? (хотя в это я почти не верю).
Неактивний
"СтОит разрисовать и понять схему подключения того, что не работает. И по каждому сигналу разобраться с тем, что и как должно быть подключено и обработано программой." дельный совет почему не хотите ему следовать? )
"Потому и прошу подсказать, куда двигаться." - тут кто то упоминал так называемые хакерспейсы ) наверное туда ) там по идеи никто не будет приходить и требовать ДАЙ ))
"есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят" побольше дебагной инфы ) и найдете совою там или чужую недоработку )
пример Serial.println("Hello, world?");
Неактивний
сколько же вас грамотных и все, наверное самоучки, и учитель у всех - интернет... А я сажусь заливать в машинку свои куралесы, малый приходит "Дай!"... Потому и прошу подсказать, куда двигаться.
И еще: есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят (и приходят ли) на неё по зубу? Может не в скетче дело, а в андроиде? (хотя в это я почти не верю).
Я действительно самоучка. Только тогда интернетов было мало... Фидонет только начиналась. В своих куралесах Вы бы разобрались, а проблема в том, что Вам нужно заставить работать ЧУЖУЮ программу. Не понимая как она устроена, из каких операторов состоит - это как выслушивание китайской речи, ни разу не заглянув даже в разговорник.
Своему старшему сыну я тоже купил Ардуино в виде набора Матрёшки, чтобы оба сына приходили и говорили "Дай, покажи и расскажи!". Это очень удивительно интересное занятие вместе учиться новому! Даже младший, не умеющий читать пришёл и попросил научить его собирать, понимать и рисовать схемы, ибо школой ещё не отучен от знаний, ещё свежо стремление быть взрослым, т.е. уметь то, что делают взрослые.
Если Вы хотите научиться всему тому, о чём спрашиваете (и даже большему), то лучший, известный мне, видеокурс по Ардуино у МФТИ "Строим роботов на Ардуино от светофора до 3Д принтера" https://ru.coursera.org/learn/roboty-arduino
С уважением. Марат.
Неактивний
Я рад за Ваших детей и Вам мое уважение за такой подход. Только моему сыну всего 3 года, он ещё не разговаривает толком и хочет он машинку, а не дуинку. С операторами по ходу разбираюсь Чужие программы в слепую не копирую, - стараюсь понять принцип, а потом адаптировать для своей задачи.
Сейчас получил из поднебесной дисплей 16*2 постараюсь посмотреть, что приходит с андроида по зубу в дуинку, потом буду двигаться дальше.
За видео курс спасибо - полезный ресурс. Буду изучать.
Неактивний
ладно, как бы я сделал
bt - для начала подключите к компьютеру USB-UART
и смотрите что и как шлет ваша программа для управления
далее ноутом pair вашу машинку и не спеша управляющие команды,
по коду видно что с терминалки вполне может успешно управляться
если с данными все в порядке
то
if(Serial.available() > 0){
command = Serial.read();
это меняйте на
// if(Serial.available() > 0)
{
command = 'F';
dealy (1000);
и смотрите что происходит с вашей машинкой,
найдете ошибку, все вернете на свои места
Марат не зря просил разбить по частям, другого выхода, если не запустилось сразу у Вас нет )
либо поискать иной пример
[ вырезано цензурой ] RemoteXY Pro 92 грн ???????????
https://play.google.com/store/apps/deta … motexy.pro
Неактивний
поздравляю с ребятенком )
не жадничайте ) работайте с ребенком, даже если ему всего 3 годика ) это окупится, и не машинку он хочет а поработать с Вами )
Неактивний