Советы и помошь
- Войдите на сайт для отправки комментариев
Вс, 03/05/2020 - 01:56
Мой код для маленько машинки на arduino uno
Я хотел бы узнать мнение о коде и как можно его усовершенствовать или как исправить ошибки дапушеные в коде
Данный конкретный код усовершенствовать невозможно. Он даже вставлен неправильно
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
#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); }Для экономии памяти обозначение пинов дуни провести через #define
Ну или уменьшить объем выделяемой для констант с int до byte. Меньше байта не выделить, а int сильно расточительно для этого. Define подошел бы тут идеально (на мой взгляд).
ЗЫ: И почему один и тот же пин объявлен хренпоймикак? Я про певый. Он и через Port_a объявлен (и используется как вход) и он же как MC1 и объявлен как выход. Этот код точно рабочий и его только улучшить нужно?
Для экономии памяти обозначение пинов дуни провести через #define
В данном случае - разницы не будет, компилятор видит, что пины объвлены как const, нигде не меняются, поэтому он тупо соптимизирует, и подставит константы. Можете проверить сами, написав пару простеньких скетчей, где в одном пин объявлен как const int, а во втором - через define.
Посоветую Вам написать комментарии к программе. Начиная с переменных. И нам попроще понять Вашу логику, и Вам через полгода не надо будет мучительно вспоминать - "А чего это я там обозначил МС5?". Кроме того это хороший стиль программирования - а к хорошему надо себя приучать.
Для экономии памяти обозначение пинов дуни провести через #define
Ну или уменьшить объем выделяемой для констант с int до byte. Меньше байта не выделить, а int сильно расточительно для этого. Define подошел бы тут идеально (на мой взгляд).
ЗЫ: И почему один и тот же пин объявлен хренпоймикак? Я про певый. Он и через Port_a объявлен (и используется как вход) и он же как MC1 и объявлен как выход. Этот код точно рабочий и его только улучшить нужно?
То есть если даже будет const int , то все равно если значение меньше 254 будет выделен 1 байт вместо двух?
Я читал, что в Дуне конст и дефайн почти синонимы по выделению памяти, но сам не мерял.
То есть если даже будет 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); }Скетч с define:
#define PIN 13 void setup() { pinMode(PIN,OUTPUT); } void loop() { digitalWrite(PIN,!digitalRead(PIN)); delay(500); }Разницу видите?
Я не спорю, ни в коем случае, уточнил. Спасибо за проделанный опыт и потраченное время.