Шаговый двигатель из консервных банок.... Код (C++): // подключаем библиотеку для управления дисплеем #include <LiquidCrystal.h> // инициализируем пины для упраления дислем LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define ENA 44 #define IN1 40 #define IN2 42 #define ENB 45 #define IN3 41 #define IN4 43 #define ACW 36 // anticlockwise button #define STP 37 // stop button #define CCW 38 // clockwise button #define SPD A8 // Speed potenciometr #define FRC 39 // force boolean ACW_STATE = false; boolean CCW_STATE = false; boolean STP_STATE = false; boolean FRC_STATE = false; byte CurrPosit = 11; int CurrSpeed = 0; // об/мин int ItervSpeed = 0; // int MAXSPEED = 0; int ALLPosit[13]; void setup() { ALLPosit[0] = B00000000; // Х/З & STOP ALLPosit[1] = B11000000; // 30 ALLPosit[2] = B00011000; // 60 ALLPosit[3] = B10100000; // 90 ALLPosit[4] = B00010100; // 120 ALLPosit[5] = B11000000; // 150 ALLPosit[6] = B00011000; // 180 ALLPosit[7] = B10100000; // 210 ALLPosit[8] = B00010100; // 240 ALLPosit[9] = B11000000; // 270 ALLPosit[10] = B00011000; // 300 ALLPosit[11] = B10100000; // 330 ALLPosit[12] = B00010100; // 360 pinMode(ENA,OUTPUT); pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); pinMode(ENB,OUTPUT); pinMode(IN3,OUTPUT); pinMode(IN4,OUTPUT); pinMode (ACW,INPUT_PULLUP); pinMode (STP,INPUT_PULLUP); pinMode (CCW,INPUT_PULLUP); pinMode (FRC,INPUT_PULLUP); lcd.begin(16, 2); clockwise(); } void clockwise() //вращение по часовой стрелке { CurrPosit = CurrPosit + 1; if (CurrPosit == 13) CurrPosit = 1; stepmotor(); } void anticlockwise() //вращение против часовой стрелки { CurrPosit = CurrPosit - 1; if (CurrPosit == 0) CurrPosit = 12; stepmotor(); } void stepmotor() // 1 шаг на 30 градусов { digitalWrite(ENA,0); digitalWrite(ENB,0); digitalWrite(IN1,bitRead(ALLPosit[CurrPosit],6)); digitalWrite(IN2,bitRead(ALLPosit[CurrPosit],5)); digitalWrite(IN3,bitRead(ALLPosit[CurrPosit],3)); digitalWrite(IN4,bitRead(ALLPosit[CurrPosit],2)); digitalWrite(ENA,bitRead(ALLPosit[CurrPosit],7)); digitalWrite(ENB,bitRead(ALLPosit[CurrPosit],4)); } void superFRC() //Режим суперфорсажа (без дисплея) { label: MAXSPEED = map(analogRead(SPD), 0, 1023, 10000, 1000); delayMicroseconds(MAXSPEED); if (ACW_STATE) clockwise(); if (CCW_STATE) anticlockwise(); if (digitalRead(STP)) goto label; } void loop() { lcd.clear(); //Читаем значение потеницометра int a = analogRead(SPD); //Значения в оборотах в винуту от 1 до 250 без форсажа и от 250 до 5010 с форсажем if (!FRC_STATE) CurrSpeed = map(a, 0, 1023, 1, 250); else CurrSpeed = map(a, 0, 1023, 5010, 250); //Расчитываем интервал ItervSpeed = int (60000/12/CurrSpeed); //Читаем значение кнопок и записываем их в переменные if (!ACW_STATE) ACW_STATE = !digitalRead(ACW); if (!CCW_STATE) CCW_STATE = !digitalRead(CCW); if (!FRC_STATE) FRC_STATE = !digitalRead(FRC); STP_STATE = !digitalRead(STP); if (STP_STATE) { ACW_STATE = 0; CCW_STATE = 0; FRC_STATE = 0; } if (ACW_STATE) clockwise(); if (CCW_STATE) anticlockwise(); //на полном ходу перестаем отображать значения на экране !!! //и уходим в режим суперфорсажа if (ItervSpeed != 0) { //Печатаем значения на экране lcd.setCursor(0,1); lcd.print(CurrSpeed); //Обороты в минуту lcd.print("ob/min "); lcd.print(ItervSpeed); lcd.print("mS"); //Поворот на 30 градусов за mS lcd.setCursor(4, 0); lcd.print(ACW_STATE); lcd.print(STP_STATE); lcd.print(CCW_STATE); lcd.print(" M"); lcd.print(MAXSPEED); //минимальный интервал (мкс) до срыва синхронизации lcd.setCursor(15, 0); lcd.print(FRC_STATE); //режим работы шаговый/форсированый lcd.setCursor(0,0); lcd.print(CurrPosit*30); //Текущий угол поворота if (ACW_STATE || CCW_STATE) delay(ItervSpeed); else delay(125); } else superFRC(); // Взлетаем }
А вот и двухфазный бесколлекторный моторчеГ: Кому лень смотреть видео несколько картиночек: Скетч: Код (C++): #define SENS1 14 // А0 #define SENS2 15 // А1 #define SENS3 16 // А2 #define BTyel 17 // А3 anticlockwise button #define BTred 18 // А4 stop button #define BTgre 19 // А5 clockwise button #define SPD A7 // Speed potenciometr int IN1=2; //2 #define ENA 3 //~ int IN2=4; //4 int IN3=5; //5 #define ENB 6 //~ int IN4=7; //7 boolean sen1; boolean sen2; boolean sen3; boolean yel; boolean gre; void setup() { pinMode(ENA,OUTPUT); pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); pinMode(ENB,OUTPUT); pinMode(IN3,OUTPUT); pinMode(IN4,OUTPUT); pinMode (BTyel,INPUT_PULLUP); pinMode (BTred,INPUT_PULLUP); pinMode (BTgre,INPUT_PULLUP); pinMode (SENS1,INPUT); pinMode (SENS2,INPUT); pinMode (SENS3,INPUT); } void loop() { //Читаем значение потеницометра и преобразуем в 0...255 int spd = map(analogRead(SPD), 0, 1020, 0, 255); if (spd == 255) digitalWrite(13,1); else digitalWrite(13,0); // читаем значения сенсоров sen1 = !digitalRead(SENS1); sen2 = !digitalRead(SENS2); sen3 = !digitalRead(SENS3); // читаем значения кнопок if (!gre){ gre = !digitalRead(BTgre); //если кнопка нажата запоминаем значение и больше не опрашиваем IN1=2; //вращаем против часовой IN2=4; IN3=5; IN4=7; } if (!yel){ yel = !digitalRead(BTyel); //если кнопка нажата запоминаем значение и больше не опрашиваем IN1=4; //вращаем по часовой IN2=2; IN3=7; IN4=5; } if (!digitalRead(BTred)) { //если нажата кнопка стоп обнуляем значения других кнопок yel = false; gre = false; digitalWrite(ENA,0); digitalWrite(ENB,0); } if (yel || gre) { if (sen1 && !sen2 && sen3) { digitalWrite(ENA,0); digitalWrite(ENB,0); digitalWrite(IN1,1); digitalWrite(IN2,0); digitalWrite(IN3,0); digitalWrite(IN4,0); analogWrite(ENA,spd); analogWrite(ENB,0); goto finale; } if (!sen1 && sen2 && sen3) { digitalWrite(ENA,0); digitalWrite(ENB,0); digitalWrite(IN1,0); digitalWrite(IN2,0); digitalWrite(IN3,1); digitalWrite(IN4,0); analogWrite(ENA,0); analogWrite(ENB,spd); goto finale; } if (sen1 && !sen2 && !sen3) { digitalWrite(ENA,0); digitalWrite(ENB,0); digitalWrite(IN1,0); digitalWrite(IN2,1); digitalWrite(IN3,0); digitalWrite(IN4,0); analogWrite(ENA,spd); analogWrite(ENB,0); goto finale; } if (!sen1 && sen2 && !sen3) { digitalWrite(ENA,0); digitalWrite(ENB,0); digitalWrite(IN1,0); digitalWrite(IN2,0); digitalWrite(IN3,0); digitalWrite(IN4,1); analogWrite(ENA,0); analogWrite(ENB,spd); goto finale; } } finale:; }