Записная книжка

Добро пожаловать, гость 

Показать / спрятать

Добро пожаловать, гость! Для участия в форуме требуется регистрация.





Страниц: [1]
Автор Тема: Ардуино, шаговый двигатель управление энкодером от мыши
Ирек
Администратор
Сообщения: 58
Permalink
Сообщение Ардуино, шаговый двигатель управление энкодером от мыши
 December 28, 2015, 11:12
Цитата

Получил свой клон Arduino UNO
я новичок в этом деле.
Для начала буду экспериментировать небольшими примерами.
В этом примере управляем шаговым двигателем при помощи энкодера.
увеличение и уменьшение оборотов.
При достижении какого то максимума двигатель меняет направление, аналогично при достижении минимума
подключал вот по этой схеме
Image



int motorPin1 = 2; // контакт in1 подключается к выводу 2 ардуино 
int motorPin2 = 3; // контакт in2 подключается к выводу 3ардуино 
int motorPin3 = 4; // контакт in3 подключается к выводу 4 ардуино 
int motorPin4 = 5; // контакт in4подключается к выводу 4 ардуино 

boolean q; // фиксируем направление.
// установить скорость шагового двигателя.
int motorSpeed = 20;
int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int encoder0PinA = 6;// контакт 6 назначаем для энкодера
int encoder0PinB = 7;// контакт 7 назначаем для энкодера
int encoder0Pos = 0; // устанавливаем начальное значение 0
int encoder0PinALast = LOW;
int n = LOW;
/////////////////////////////////////////////////////////////////
void setup() {
// назначаем выходы
pinMode(motorPin1, OUTPUT); 
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(13, OUTPUT); // сюда я подключил светодиод для проверки максимума оборота
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);

}
void loop(){
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
motorSpeed--;
} else {
motorSpeed++;}

Serial.begin (9600);
Serial.println(motorSpeed*100);//  можно в терминале наблюдать скорость мотора
Serial.println(q); // в терминале смотрим направление вращения
if (motorSpeed<11) { // включаем сведодиод
digitalWrite(13, HIGH);
} else (digitalWrite(13, LOW));


}



encoder0PinALast = n;
if (motorSpeed<9)
{
(motorSpeed=9);//ограничиваем максимум
digitalWrite(13, LOW); //выключаем светодиод
q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0. 
}
if (motorSpeed>39)
{
(motorSpeed=39);//ограничиваем минимум оборотов
q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.

}
if (q == 1)anticlockwise(); // крутим влево.
else clockwise(); // крутим вправо.
}
// --------------------------------

// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed*100);
}
}
// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
for(int i = 7; i >= 0; i--)
{
setOutput(i);
delayMicroseconds(motorSpeed*100);
}
}
void setOutput(int out)
{
digitalWrite(motorPin1, bitRead(lookup[out], 0));
digitalWrite(motorPin2, bitRead(lookup[out], 1));
digitalWrite(motorPin3, bitRead(lookup[out], 2));
digitalWrite(motorPin4, bitRead(lookup[out], 3));
}


Страниц: [1]
Mingle Forum by cartpauj
Версия: 1.0.34 ; Страница загружена за 0.04 секунд.

Постоянная ссылка на это сообщение: http://cnhufa.ru/?page_id=695