RC машина на arduino на базе Китай машинки , проблемы с написанием скетча

Terranovod
Offline
Зарегистрирован: 29.04.2015

Доброго времени суток всем , пишу первый раз так что просьба сильно не пинать .

Собираю машину на радио управлении с контроллером uno +motor sheild , и китайская машинка с р.у. 

У машинки два dc мотора , на заднюю ось через редуктор и  спереди подпружиненная рейка с зубцами , которую передвигает мотор 

И собственно проблема со скетчем , точнее с его написанием 

Вот собственно что написалось :

#include <AFMotor.h>
AF_DCMotor motor1(4);
Int val='0';
Void setup() {
Serial.begin(9600);
}
Void loop(){
If(Serial.available()){
Val=Serial.read();
If(val=='W');
motor1.setSpeed(200);
motor1.run(FORWARD);
delay(100);
If(val=='S');
motor1.setSpeed(100);
motor1.run(BACKWARD);
delay(100);
}
}

Собственно при подаче 'W' в порт , стартует мотор и при последующей подачей любой команды в порт мотор остонавливается и сразу же начинает вращается все в том же направлении

Вот собственно дальше я застопорился , не могу понять что делаю не так , и почему после подачи команды 'S' в порт мотор не вращается в обратном направлении ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не могли бы копипастить точный скетч прямо из редактора, а не набивать его руками?

То, что Вы опубликовали не может никак работать, т.к. он просто не скомпилируется. Все эти Ваши Int, Void, If, то val - то Val - это некомпилируемо.

А поскольку скетч, как Вы пишете, хоть как-то работал, то все эти ошибки внесены при публикации. Поскольку я не знаю какие ещё ошибки были внесены при публикации, не вижу смысла смотреть текст скетча.

Опубликуйте нормально.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Переделывал дочери машинку, добавил фары, стоп сигналы, фанари заднего хода, автоматическое выключение через 3 минуты бездействия, плавный разгон, задний ход на уменшенной скорости, выбег (если отпустить кнопку вперед то постепенно замедляеться, если в это время нажать назад, то мотор останавливаеться, при повторном нажатии назад едет назад - как бы тормоз нажали)

Код

#include <DigOut.h>
#define F_in 5//вход вперед
#define Rev_in 6//вход назад
#define L_in 7//вход влево
#define R_in 8//вход вправо

DigOut F_out(11,0);//#define F_out 11//выход вперед
DigOut Rev_out(10,0);//#define Rev_out 10//выход назад
DigOut L_out(12,0);//#define L_out 12//выход влево
DigOut R_out(13,0);//#define R_out 13//выход вправо
//Фары
DigOut Rev_L(19);//#define Rev_L 19//задний ход белые
DigOut Stop_L(18);//#define Stop_L 18//Стоп сигнал
//питание
DigOut Power(17,1);//#define Power 17//пин питания
unsigned long currentMillis=0;
long previousMillis = 0; // храним время последнего действия
long interval = 120000;//время автовыключения 2 мин

byte Sp_F=0;//Скорость вперед
byte Sp_Rev=0;//Скорость назад

void setup() { 
  pinMode(F_in, INPUT);    
  pinMode(Rev_in, INPUT);  
 // pinMode(L_in, INPUT);  
 // pinMode(R_in, INPUT);   

  //мигаем
Stop_L.HI();//  digitalWrite(Stop_L,1);
  delay(250);
Stop_L.LO();//  digitalWrite(Stop_L,0);
  delay(250);
Stop_L.HI();//  digitalWrite(Stop_L,1);
  delay(250);
Stop_L.LO();//  digitalWrite(Stop_L,0);
  delay(250);
}

void loop(){
  currentMillis = millis();

  if (Sp_F>0 || Sp_Rev>0){

    previousMillis = currentMillis; 
  }

  key();
  light();
//  delay(7);

}

//опрос клавиш
void key(){
  if (digitalRead(L_in)==1){//если нажали влево
    select (1);
  }

  if (digitalRead(R_in)==1){//если нажали вправо
    select (2);
  } 

  if (digitalRead(F_in)==1){//нажали вперед
    select (3);
  }

  if (digitalRead(Rev_in)==1){//нажали назад
    select (4);
  }
}

//Фары
void light(){
  if (Sp_Rev>0){//задний ход
    Rev_L.HI();//    digitalWrite(Rev_L,1);
  }
  else
  {
    Rev_L.LO();//    digitalWrite(Rev_L,0);
  }

  if (Sp_F==0 && Sp_Rev==0){
    //выключение если бездействуем
    if(currentMillis - previousMillis > interval) {
      Stop_L.LO();//  digitalWrite(Stop_L,0);
      delay(250);
      Stop_L.HI();//  digitalWrite(Stop_L,1);
      delay(250);
      Stop_L.LO();//  digitalWrite(Stop_L,0);
      Power.LO();//      digitalWrite(Power,0);//выключаем
    }
    Stop_L.HI();//    digitalWrite(Stop_L,1);
  }
  else
  {
    Stop_L.LO();//    digitalWrite(Stop_L,0);
  }

  if (Sp_F >50){
L_out.HI();//    digitalWrite(L_out,1);
R_out.HI();//    digitalWrite(R_out,1);
  }
  else
  {
L_out.LO();//    digitalWrite(L_out,0);
R_out.LO();//    digitalWrite(R_out,0); 
  }
}

void select (byte key){
  switch (key) {
  case 1://влево
    R_out.LO();//    digitalWrite(R_out,0);//right off
    L_out.HI();//    digitalWrite(L_out,1);//left on
    break;
  case 2://вправо
    L_out.LO();//    digitalWrite(L_out,0);//left off
    R_out.HI();//    digitalWrite(R_out,1);//right on
    break;
  case 3://вперед
    break;
  case 4://назад
    break;
  }
}

 

Видео 1

Видео 2

Делал на голой ATmega8 без кварца, воткнул её между приемником команд и Н мостами на транзисторах которые в машинку встроенны были.

Terranovod
Offline
Зарегистрирован: 29.04.2015

ЕвгенийП пишет:

Вы не могли бы копипастить точный скетч прямо из редактора, а не набивать его руками?

То, что Вы опубликовали не может никак работать, т.к. он просто не скомпилируется. Все эти Ваши Int, Void, If, то val - то Val - это некомпилируемо.

А поскольку скетч, как Вы пишете, хоть как-то работал, то все эти ошибки внесены при публикации. Поскольку я не знаю какие ещё ошибки были внесены при публикации, не вижу смысла смотреть текст скетча.

Опубликуйте нормально.

Дико извеняюсь , писал с телефона по памяти , по возможности опубликую 

Terranovod
Offline
Зарегистрирован: 29.04.2015

За код спасибо , очень интересно , я так понял переделываласпеределывалась ещё рабочая машинка ?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Была рабочая. Только поведение не устраивало и функционал. Дочь справиться с ней не могла, пришлось замедлить задний ход и плавный разгон. Хотел добавить функцию наподобие переключения передач (нажал один раз вперед - одна скорость, ещё раз вперед вторая и т.д., ну и при нажатии назад переключение вниз, а при остановленной реверс.), ещё хотел добавить такую функцию - при включении питания если зажата кнопла влево, то включать фары, если нет то не включать.

baskery
Offline
Зарегистрирован: 08.12.2014

yul-i-an пишет:

Переделывал дочери машинку, добавил фа

очень крутой функционал получился, я купил сыну мобиль побольше, в котором можно сидеть, тоже есть огромное желание переделать управление, добавить свет и тд, сейчас это примитивное устройство, двигатель управляется реле, соответсвенно очень резко дергается на старте и при отпускании газа, малыша мотает так что он ударяется головой об руль а ваш код очень подходит, его надо немного допилить под мои задачи, если с механикой и электроникой я как-то дружу, то в программировании я не очень силен, не могли бы вы мне помочь с кодом под мои задачи?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Если только подсказать. Работы много.

Во первых газульку нужно на переменном резисторе и датчик скорости вращения колеса, чтобы можно было организовать четкий старт без задержек, плавную регулеровку скорости и её не изменность при изменении нагрузки. (нужен будет ПИ регулятор).

baskery
Offline
Зарегистрирован: 08.12.2014

я думаю сильно не усложнять механику, реле выбросить, заменить его на н-мост или просто на транзистор и диод тк реверс организуется на механическом переключателе, педалька так же остается обычной кнопкой но уже шим будет плавно нарастать до максимального значения в течении секунды, стопы будут загораться после отпускания газа скажем на 2 секунды и шим будет плавно снижаться, еще отдельной кнопкой организовать аварийку или поворотники, думаю это все что нужно мне, понимаю что все это элементарно и по отдельности все функции могу реализовать но сам сшить код в общую программу не хватает ума

а да, на кнопку(педальку) надо еще добавить антидребезг тк ткперь это не мех прерыватель цепи а кнопка на вход мк

karakadil
Offline
Зарегистрирован: 08.12.2016
 Первая попытка: Пробовал поморгать встроенным диодом написал это:
int ledpin=13
void setup(){
pinMode (ledpin, OUTPUT);//назначение13pin выходом
}
void loop(){
 
digitalWrite(ledpin,HIGH);//вывод 5v на13 pin
delay(1000);//задержка в миллисекундах
digitalWrite(ledpin, LOW);//отключение на 13pin
delay(1000);//задержка в миллисекундах
}
Получил это:
sketch_dec08a.ino:2:1: error: expected unqualified-id before numeric constant
 
sketch_dec08a.ino:2:1: error: expected ',' or ';' before 'void'
 
Ошибка компиляции.
Подскажите, битте где ошибка?
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

karakadil пишет:

 Первая попытка: Пробовал поморгать встроенным диодом написал это:
int ledpin=13
void setup(){
pinMode (ledpin, OUTPUT);//назначение13pin выходом
}
void loop(){
 
digitalWrite(ledpin,HIGH);//вывод 5v на13 pin
delay(1000);//задержка в миллисекундах
digitalWrite(ledpin, LOW);//отключение на 13pin
delay(1000);//задержка в миллисекундах
}
Получил это:
sketch_dec08a.ino:2:1: error: expected unqualified-id before numeric constant
 
sketch_dec08a.ino:2:1: error: expected ',' or ';' before 'void'
 
Ошибка компиляции.
Подскажите, битте где ошибка?

Все же написано. (выделено мной)

Stephan
Offline
Зарегистрирован: 01.10.2015

В первой строке ; не хватает

Terranovod
Offline
Зарегистрирован: 29.04.2015

Доброго времени суток вот новый вариант скетча 


#include <SPI.h>
#include "RF24.h"


RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int data; 
int fspeed;           // forward speed 
int bspeed;           // backward speed
int lspeed;           // left speed 
int rspeed;           // right speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 5;    // PWM pin to change speed
const int in3 = 7;    // direction pin 3
const int in4 = 8;    // direction pin 4
const int enb = 3;    // PWM pin to change speed
void setup()
{
  
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n
  pinMode(in3, OUTPUT);      // connection to L298n
  pinMode(in4, OUTPUT);      // connection to L298n
  pinMode(enb, OUTPUT);      // connection to L298n
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  if (radio.available())radio.read(msg, 1);  
  if (msg[0] >=1 && msg[0] <=63)data = msg[0], rspeed = map(data, 126, 64, 0, 255), right(rspeed);
  if (msg[0] >=64 && msg[0] <=127)data = msg[0], lspeed = map(data, 63, 1, 0, 255), left(lspeed);
  if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
  if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
}

void stop()
{
  
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}
void right(int rspeed)
{
  
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enb, rspeed);
}

void left(int lspeed)
{
  
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enb, lspeed);
}

Это код написан под L298N и nrf24 

Это приемник

 

 

Terranovod
Offline
Зарегистрирован: 29.04.2015

суть проблеммы в том что компилятор ругается на строки 36-41 , в связи с тем что опыта мало не совсем понятно на что ругается , не могли бы подсказать ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как Вы выражаетесь

Terranovod пишет:

 не совсем понятно на что ругается 

Вы ж его ругань от нас скрыть решили.

Хрустальный шар довольно мутно показал, что скорее всего ему не понравилось то, что Вы используете функции right, left, backward и forward не возвращающие значения, в качестве правого операнда операции "запятая". Значение правого операнда и есть значение всей операции, а Вы туда функции типа void напихали.

Terranovod
Offline
Зарегистрирован: 29.04.2015

Доброго времени суток 

 

ЕвгенийП пишет:

Как Вы выражаетесь

Terranovod пишет:

 не совсем понятно на что ругается 

Вы ж его ругань от нас скрыть решили.

Хрустальный шар довольно мутно показал, что скорее всего ему не понравилось то, что Вы используете функции right, left, backward и forward не возвращающие значения, в качестве правого операнда операции "запятая". Значение правого операнда и есть значение всей операции, а Вы туда функции типа void напихали.

дико извеняюсь не скопировал сообщения об ошибке , спасибо за ответ , но вот нюанс , сегодня решил ради интереса запустить компиляцию , все скомпелировалось и залилось в уно .

Ответ проанализирую , если честно то только учусь , но очень интерестно 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Terranovod пишет:

дико извеняюсь не скопировал сообщения об ошибке , спасибо за ответ , но вот нюанс , сегодня решил ради интереса запустить компиляцию , все скомпелировалось и залилось в уно .

Значит в IDE стоят странные опции (они часто такие ставят, чтобы компилятор меньше ругался).

Но работать это всё равно будет не так, как Вы ожидаете. Разберитесь. Вот смотрите

if (msg[0] >=1 && msg[0] <=63)data = msg[0], rspeed = map(data, 126, 64, 0, 255), right(rspeed);

Если условие окажется истинным, то должно выполниться выражение

data = msg[0], rspeed = map(data, 126, 64, 0, 255), right(rspeed);

Теперь внмательно читайте описание операции "запятая" и скажите, что должно присвоиться переменным data и rspeed? Уверен - не то, чего бы Вы хотели.

Разобрались? Если да, то заодно поймёте почему вызов right в правой части не имеет смысла.

Pratak
Pratak аватар
Offline
Зарегистрирован: 05.08.2016

Вот еще классная переделка китайской машинки с двумя моторчиками. Управляется по блютузу с планшета. Начинка - полный самопал. Большая такая.

Видео