Добрый день! Подскажите как написать скетч для Arduino UNO Хочу реализовать такой алгоритм: При считывании показаний с внешнего источника, должно выполняться определенное условие Сейчас смог реализовать Столкнулся с проблемами: 1)не получается разбить участок больше 3-х частей 2) не получается заставить двигатель однократно выполнеть дествие при определенном условии и перейти в другие режимы (пробывал использовать for и while) Подскажите в каком направлении двигаться? Скетч: Код (Text): #include <Stepper.h> const int stepsPerRevolution = 200; //количество шагов на 360 градусов Stepper myStepper(stepsPerRevolution, 8,9,10,11); //выходы int Poti=0; int x=0; void setup() { } void loop() { x=analogRead(Poti); if (x<300 || x>800) { myStepper.setSpeed(1); myStepper.step(10); //открывать } else { myStepper.setSpeed(1); myStepper.step(-10); //закрывать } }
if (x>0 || x<299) { //Условие } if (x>300 || x<799) { //Условие } if (x>800 || x<1022) { //Условие } Можно switch и кейсом еще. Кстати сколько вольт на движке? Энкодер 12 вольт хочу подключить. И задача кстати такая же как у вас. C программирование беды нету. Вот с подключением проблемы у меня...
switch и case - я использовал. Проблема еще, чтобы двигатель сделал +10шагов в дапазоне 0...299 и -10 шагов в диапазоне 300...800. Шаговый двигатель работает через драйвер, не помню на какое напряжение расчитан
if (x>0 && x<299) { myStepper.setSpeed(1); myStepper.step(10); } if (x>300 && x<799) { myStepper.setSpeed(1); myStepper.step(-10); }
это код будет постоянно крутить двигатель по 10 шагов. Можно сделать чтобы в определенном диапазоне он сделал всего 10 шагов и остановился.
if (x>0 && x<299) { myStepper.setSpeed(1); myStepper.step(10); //Вот так нельзя остановить двигатель, если он находится в диапазоне от 0 до 300 myStepper.stop(); }
Так не получится, ибо программа бежит по кругу. мне так кажется, надо ввести флаг. Код (Text): bool stepLeft = true; // допустим так обзовем наш флаг ...... void loop(){ ... if(x>0 && x<299){ if(stepLeft){ myStepper.setSpeed(1); myStepper.step(10); stepLeft=false; } }else{ stepLeft=true; } ... } как-то так должно заработать
Вот так я реализовал и все работает. Основной код программы: Код (Text): #include <Stepper.h> //двигатель const int stepsPerRevolution = 200; //количество шагов на 360 градусов Stepper myStepper(stepsPerRevolution, 8,9,10,11); int x=0; int y=0; int z=0; int Poti=0; float raw=0; void setup() { pinMode(13, OUTPUT); } void loop() { raw=analogRead(Poti); if (raw>0 && raw<100) { x=0; y=0; z=0;} if (raw>100 && raw<200) { y=0; z=0; while (x<1) { myStepper.setSpeed(50); myStepper.step(-100); x=x+1;} } if (raw>200 && raw<300) { x=0; z=0; while (y<1) { myStepper.setSpeed(50); myStepper.step(150); y=y+1;} } if (raw>300 && raw<400) { x=0; y=0; z=0; myStepper.setSpeed(150); myStepper.step(2); } if (raw>500 && raw<600) { x=0; y=0; while (z<1){ myStepper.setSpeed(150); myStepper.step(-150); z=z+1;} } }
А у меня другая проблема, нужно чтоб двигатель неостанавливался, а он делает четверть оборота и останавливается... вот отрывок действия при нажатии кнопки RIGHT/ Код (C++): void rightMenu(int x) { switch (x) { case 1: clearPrintTitle(); lcd.print ("0.01 >>"); myStepper.setSpeed(200); myStepper.step(stepsPerRevolution ); break; а это вся программа: Код (C++): #include <LiquidCrystal.h> #include <Stepper.h> //Подключение шагового двигателя const int stepsPerRevolution = 3200; // кол-во импульсов на оборот Stepper myStepper(stepsPerRevolution, 19, 21); // Подключение ШД // Initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //States for the menu. int currentMenuItem = 0; int lastState = 0; int motor=0; void setup() { //Set the characters and column numbers. lcd.begin(16, 2); //Print default title. clearPrintTitle(); //Параметры шагового двигателя // pinMode(pul, OUTPUT); // pinMode(dir, OUTPUT); } void loop() /* //********************Режим работы шагового двигателя if (motor==1) { myStepper.setSpeed(200); // step 1/100 of a revolution: myStepper.step(-stepsPerRevolution ); } if (motor==2) { myStepper.setSpeed(200); // step 1/100 of a revolution: myStepper.step(-stepsPerRevolution ); } */ { //Call the main menu. mainMenu(); } void mainMenu() { //State = 0 every loop cycle. int state = 0; //Refresh the button pressed. int x = analogRead (0); //Set the Row 0, Col 0 position. lcd.setCursor(0,0); //Check analog values from LCD Keypad Shield if (x < 100) { //Right state = 4; } else if (x < 200) { //Up state = 1; } else if (x < 400){ //Down state = 2; } else if (x < 600){ //Left state = 5; } else if (x < 800){ //Select state = 3; } //If we are out of bounds on th menu then reset it. if (currentMenuItem < 0 || currentMenuItem > 13) { currentMenuItem = 0; } //If we have changed Index, saves re-draws. if (state != lastState) { if (state == 1) { //If Up currentMenuItem = currentMenuItem - 1; displayMenu(currentMenuItem); } else if (state == 2) { //If Down currentMenuItem = currentMenuItem + 1; displayMenu(currentMenuItem); } else if (state == 3) { //If Selected motor=0; //selectMenu(currentMenuItem); } else if (state == 4) { //If RIGHT rightMenu(currentMenuItem); } else if (state == 5) { //If LEFT leftMenu(currentMenuItem); } //Save the last State to compare. lastState = state; } //Small delay delay(5); } //Display Menu Option based on Index. void displayMenu(int x) { switch (x) { case 1: clearPrintTitle(); lcd.print ("0.01"); break; case 2: clearPrintTitle(); lcd.print ("0.015"); break; case 3: clearPrintTitle(); lcd.print ("0.02"); break; case 4: clearPrintTitle(); lcd.print ("0.03"); break; case 5: clearPrintTitle(); lcd.print ("0.04"); break; case 6: clearPrintTitle(); lcd.print ("0.06"); break; case 7: clearPrintTitle(); lcd.print ("0.08"); break; case 8: clearPrintTitle(); lcd.print ("0.1"); break; case 9: clearPrintTitle(); lcd.print ("0.13"); break; case 10: clearPrintTitle(); lcd.print ("0.15"); break; case 11: clearPrintTitle(); lcd.print ("0.18"); break; case 12: clearPrintTitle(); lcd.print ("0.20"); break; case 13: clearPrintTitle(); lcd.print ("0.22"); break; } } //Print a basic header on Row 1. void clearPrintTitle() { lcd.clear(); lcd.setCursor(0,0); lcd.print(" Podacha mm/ob "); lcd.setCursor(0,1); } //Show the rightMenu on Screen. void rightMenu(int x) { switch (x) { case 1: clearPrintTitle(); lcd.print ("0.01 >>"); myStepper.setSpeed(200); myStepper.step(stepsPerRevolution ); break; //Call the function that belongs to Option 1 case 2: clearPrintTitle(); lcd.print ("0.015 >>"); //digitalWrite(dir, HIGH); // motor=2; //Call the function that belongs to Option 2 break; case 3: clearPrintTitle(); lcd.print ("0.02 >>"); //Call the function that belongs to Option 3 break; case 4: clearPrintTitle(); lcd.print ("0.03 >>"); //Call the function that belongs to Option 4 break; case 5: clearPrintTitle(); lcd.print ("0.04 >>"); //Call the function that belongs to Option 5 break; case 6: clearPrintTitle(); lcd.print ("0.06 >>"); //Call the function that belongs to Option 6 break; case 7: clearPrintTitle(); lcd.print ("0.08 >>"); //Call the function that belongs to Option 7 break; case 8: clearPrintTitle(); lcd.print ("0.1 >>"); //Call the function that belongs to Option 8 break; case 9: clearPrintTitle(); lcd.print ("0.13 >>"); //Call the function that belongs to Option 9 break; case 10: clearPrintTitle(); lcd.print ("0.15 >>"); //Call the function that belongs to Option 10 break; case 11: clearPrintTitle(); lcd.print ("0.18 >>"); //Call the function that belongs to Option 11 break; case 12: clearPrintTitle(); lcd.print ("0.2 >>"); //Call the function that belongs to Option 12 break; case 13: clearPrintTitle(); lcd.print ("0.22 >>"); //Call the function that belongs to Option 13 break; } } //Show the leftMenu on Screen. void leftMenu(int x) { switch (x) { case 1: clearPrintTitle(); lcd.print ("0.01 <<"); myStepper.setSpeed(200); myStepper.step(-stepsPerRevolution ); break; case 2: clearPrintTitle(); lcd.print ("0.015 <<"); //digitalWrite(dir, LOW); // motor=2; //Call the function that belongs to Option 2 break; case 3: clearPrintTitle(); lcd.print ("0.02 <<"); //Call the function that belongs to Option 3 break; case 4: clearPrintTitle(); lcd.print ("0.03 <<"); //Call the function that belongs to Option 4 break; case 5: clearPrintTitle(); lcd.print ("0.04 <<"); //Call the function that belongs to Option 5 break; case 6: clearPrintTitle(); lcd.print ("0.06 <<"); //Call the function that belongs to Option 6 break; case 7: clearPrintTitle(); lcd.print ("0.08 <<"); //Call the function that belongs to Option 7 break; case 8: clearPrintTitle(); lcd.print ("0.1 <<"); //Call the function that belongs to Option 8 break; case 9: clearPrintTitle(); lcd.print ("0.13 <<"); //Call the function that belongs to Option 9 break; case 10: clearPrintTitle(); lcd.print ("0.15 <<"); //Call the function that belongs to Option 10 break; case 11: clearPrintTitle(); lcd.print ("0.18 <<"); //Call the function that belongs to Option 11 break; case 12: clearPrintTitle(); lcd.print ("0.2 <<"); //Call the function that belongs to Option 12 break; case 13: clearPrintTitle(); lcd.print ("0.22 <<"); //Call the function that belongs to Option 13 break; } } Подскажите что нетак?