Всем привет! Недавно начал работать с ардуино. Сделал проекты со светодиодами, потенциометрами, моторчиками и сервоприводами. Решил взяться за проект посложнее, а именно - робота, который сам перемещается. Написал программу для сбора данных в массив и вращение сервы, но оно у меня в последовательном порту выдаёт только значения massAll[0][0] и massAll[0][1]. Нужна помощь, не понимаю в чём проблема. Код (C++): #include <Servo.h> #include <Ultrasonic.h> Ultrasonic ultrasonic(8,9); Servo servo; int massAll[3][4]; int massMax[3]; int massMin[3]; int val_servo ; void setup() { Serial.begin(9600); servo.attach(3); } void mass_left(){ if (val_servo = 40){ massAll[0][0] = ultrasonic.Ranging(CM); Serial.print("massAll[0][0]"); Serial.println(" = "); Serial.println(massAll[0][0]); } else if (val_servo = 50){ massAll[0][1] = ultrasonic.Ranging(CM); Serial.print("massAll[0][1]"); Serial.println(" = "); Serial.println(massAll[0][1]); } else if (val_servo = 60){ massAll[0][2] = ultrasonic.Ranging(CM); Serial.print("massAll[0][2]"); Serial.println(" = "); Serial.println(massAll[0][2]); } else if (val_servo = 65){ massAll[0][3] = ultrasonic.Ranging(CM); Serial.print("massAll[0][3]"); Serial.println(" = "); Serial.println(massAll[0][3]); } } void mass_forvard(){ if (val_servo = 70){ massAll[1][0] = ultrasonic.Ranging(CM); Serial.print("massAll[1][0]"); Serial.println(" = "); Serial.println(massAll[1][0]); } else if (val_servo = 80){ massAll[1][1] = ultrasonic.Ranging(CM); Serial.print("massAll[1][1]"); Serial.println(" = "); Serial.println(massAll[1][1]); } else if (val_servo = 90){ massAll[1][2] = ultrasonic.Ranging(CM); Serial.print("massAll[1][2]"); Serial.println(" = "); Serial.println(massAll[1][2]); } else if (val_servo = 100){ massAll[1][3] = ultrasonic.Ranging(CM); Serial.print("massAll[1][3]"); Serial.println(" = "); Serial.println(massAll[1][3]); } } void mass_right(){ if (val_servo = 105){ massAll[2][0] = ultrasonic.Ranging(CM); Serial.print("massAll[2][0]"); Serial.println(" = "); Serial.println(massAll[0][0]); } else if (val_servo = 110){ massAll[2][1] = ultrasonic.Ranging(CM); Serial.print("massAll[2][1]"); Serial.println(" = "); Serial.println(massAll[2][0]); } else if (val_servo = 120){ massAll[2][2] = ultrasonic.Ranging(CM); Serial.print("massAll[2][2]"); Serial.println(" = "); Serial.println(massAll[2][2]); } else if (val_servo = 130){ massAll[2][3] = ultrasonic.Ranging(CM); Serial.print("massAll[2][3]"); Serial.println(" = "); Serial.println(massAll[2][3]); } } void servo_osnova(){ for(val_servo; val_servo <= 130; val_servo++){ servo.write(val_servo); delay(5); } servo.write(90); delay(20); for(val_servo; val_servo >= 40; val_servo--){ servo.write(val_servo); delay(5); } } void loop() { mass_left(); mass_forvard(); mass_right(); servo_osnova(); }
Ошибка в логике. Перый проход лупа. Val_servo = 0. Вызываются функции mass_* ничего не выводят. Вызывается функция servo_osnova Прощелкивает до 130 Серваке повернулась val_servo = 130 Затем крутится обратно Докрутилась до 40 Val_servo= 40 Следующий цикл loop Запускается mass_left Видит вал_серво 40 Выводит Или.д
Перепешите функцию servo_osnova() без использования циклов (функция loop() сама по себе цикл). Так что бы за один вызов функции значение val_servo менялось только один раз. Должно заработать как Вы хотите.