Советы и помошь

bashkir_kino
Offline
Зарегистрирован: 03.05.2020

Мой код для маленько машинки  на  arduino uno

Я хотел бы узнать мнение о коде и как можно его усовершенствовать или как исправить ошибки дапушеные в коде

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Данный конкретный код усовершенствовать невозможно.  Он даже вставлен неправильно

Alexander
Offline
Зарегистрирован: 25.04.2010
bashkir_kino
Offline
Зарегистрирован: 03.05.2020
#include<Servo.h>

const int ENA=5;
const int MC1=1;
const int MC2=2;
const int ENB=6;
const int MC3=3;
const int MC4=4;
const int ENC=10;
const int MC5=7;
const int MC6=8;
const int END=11;
const int MC7=9;
const int MC8=12;
const int Pot=0;
const int Pot_a=1;
const int Servo=13;
int val=0;
int val_a=0;
int speed=0;
int turn=0;

class Servo myServo;

void setup(){
		myServo.attach(Servo);
    pinMode(ENA,OUTPUT);
    pinMode(MC1,OUTPUT);
    pinMode(MC2,OUTPUT);
    pinMode(ENB,OUTPUT);
    pinMode(MC3,OUTPUT);
    pinMode(MC4,OUTPUT);
	 	pinMode(ENC,OUTPUT);
    pinMode(MC5,OUTPUT);
    pinMode(MC6,OUTPUT);
    pinMode(END,OUTPUT);
    pinMode(MC7,OUTPUT);
    pinMode(MC8,OUTPUT);
    brake();
}

void loop(){
    val = analogRead(Pot);
		val_a = analogRead(Pot_a);
		turn=map(val_a,0,1024,0,140);
		myServo.write(val_a);
			
    if (val>562){
        speed=map(val,563,1024,0,255);
        forward(speed);
    }
    else if (val<482){
        speed=map(val,461,0,0,255);
        revers(speed);
    }
    else{
        brake();
    }
		
}

void forward(int rate){
    digitalWrite(ENA,LOW);
    digitalWrite(MC1,HIGH);
    digitalWrite(MC2,LOW);
    digitalWrite(ENB,LOW);
    digitalWrite(MC3,HIGH);
    digitalWrite(MC4,LOW);
		digitalWrite(ENC,LOW);
    digitalWrite(MC5,HIGH);
    digitalWrite(MC6,LOW);
    digitalWrite(END,LOW);
    digitalWrite(MC7,HIGH);
    digitalWrite(MC8,LOW);
    analogWrite(ENA,rate);
    analogWrite(ENB,rate);
	 	analogWrite(ENC,rate);
    analogWrite(END,rate);
}

void revers(int rate){
    digitalWrite(ENA,LOW);
    digitalWrite(MC1,LOW);
    digitalWrite(MC2,HIGH);
    digitalWrite(ENB,LOW);
    digitalWrite(MC3,LOW);
    digitalWrite(MC4,HIGH);
	  digitalWrite(ENC,LOW);
    digitalWrite(MC5,LOW);
    digitalWrite(MC6,HIGH);
    digitalWrite(END,LOW);
    digitalWrite(MC7,LOW);
    digitalWrite(MC8,HIGH);
    analogWrite(ENA,rate);
    analogWrite(ENB,rate);
	 	analogWrite(ENC,rate);
    analogWrite(END,rate);
}

void brake(){
    digitalWrite(ENA,LOW);
    digitalWrite(MC1,LOW);
    digitalWrite(MC2,LOW);
    digitalWrite(ENB,LOW);
    digitalWrite(MC3,LOW);
    digitalWrite(MC4,LOW);
		digitalWrite(ENC,LOW);
    digitalWrite(MC5,LOW);
    digitalWrite(MC6,LOW);
    digitalWrite(END,LOW);
    digitalWrite(MC7,LOW);
    digitalWrite(MC8,LOW);
    analogWrite(ENA,HIGH);
    analogWrite(ENB,HIGH);
		analogWrite(ENC,HIGH);
    analogWrite(END,HIGH);
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Для экономии памяти обозначение пинов дуни провести через #define

Ну или уменьшить объем выделяемой для констант с int до byte. Меньше байта не выделить, а int сильно расточительно для этого. Define подошел бы тут идеально (на мой взгляд).

ЗЫ: И почему один и тот же пин объявлен хренпоймикак? Я про певый. Он и через Port_a объявлен (и используется как вход) и он же как MC1 и объявлен как выход. Этот код точно рабочий и его только улучшить нужно?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

BOOM пишет:

Для экономии памяти обозначение пинов дуни провести через #define

В данном случае - разницы не будет, компилятор видит, что пины объвлены как const, нигде не меняются, поэтому он тупо соптимизирует, и подставит константы. Можете проверить сами, написав пару простеньких скетчей, где в одном пин объявлен как const int, а во втором - через define.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Посоветую Вам написать комментарии к программе. Начиная с переменных. И нам попроще понять Вашу логику, и Вам через полгода не надо будет мучительно вспоминать - "А чего это я там обозначил МС5?". Кроме того это хороший стиль программирования - а к хорошему надо себя приучать.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

BOOM пишет:

Для экономии памяти обозначение пинов дуни провести через #define

Ну или уменьшить объем выделяемой для констант с int до byte. Меньше байта не выделить, а int сильно расточительно для этого. Define подошел бы тут идеально (на мой взгляд).

ЗЫ: И почему один и тот же пин объявлен хренпоймикак? Я про певый. Он и через Port_a объявлен (и используется как вход) и он же как MC1 и объявлен как выход. Этот код точно рабочий и его только улучшить нужно?

То есть если даже будет const int , то все равно если значение меньше 254 будет выделен 1 байт вместо двух?
Я читал, что в Дуне конст и дефайн почти синонимы по выделению памяти, но сам не мерял. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

BOOM пишет:

То есть если даже будет const int , то все равно если значение меньше 254 будет выделен 1 байт вместо двух?
Я читал, что в Дуне конст и дефайн почти синонимы по выделению памяти, но сам не мерял. 

Ничего не будет выделено в данном случае. Компилятор просто подставит числа в нужные места, и всё. Вы проверьте, проверьте. IDE = 1.8.5, плата - Arduino Uno, скетч с const int:

const int PIN = 13;

void setup() {
  
  pinMode(PIN,OUTPUT);

}

void loop() {
  
  digitalWrite(PIN,!digitalRead(PIN));
  delay(500);

}

Цитата:

Скетч использует 964 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Скетч с define:

#define PIN  13

void setup() {
  
  pinMode(PIN,OUTPUT);

}

void loop() {
  
  digitalWrite(PIN,!digitalRead(PIN));
  delay(500);

}

Цитата:

Скетч использует 964 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Разницу видите?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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