8 (800) 350-30-16

Управление сервоприводом с помощью клавиатуры

Дата: / Категория: Интерфейсы / Автор: DOC_tr

Решил собрать что-нибудь более-менее стоящее. Например, шаговый механизм. Полноценный обзор на него вы увидите позже, а сегодня я хотел бы рассказать о работе с сервоприводом SG90. Работать с ним будем с помощью Arduino MEGA

Да, согласен, это просто. Поэтому мы будем управлять им с помощью матричной клавиатуры и выводить все данные на экран Nokia5110:

В управлении сервоприводом нет абсолютно ничего сложного и подключается он по следующей схеме:

И после того, как мы зальем данный скетч на Arduino...

#include <Servo.h>
Servo servo;
void setup(){
servo.attach(7); //привязываем привод к порту 7
}
void loop(){
servo.write(0); //ставим вал под 0
delay(2000); //ждем 2 секунды
servo.write(180); //ставим вал под 180
delay(2000); //ждем 2 секунды
}

 ... каждые 2 секунды наш серводвигатель будет делать оборот на 180 градусов.

Тут, думаю, даже и объяснять ничего не нужно. Попробуем усложнить задачу - будем считывать угол поворота из консоли.

#include <Servo.h>
Servo servo;

String message = "";
void setup(){
servo.attach(7);
Serial.begin(9600);
}

void loop(){
while (Serial.available()) {
char inc = Serial.read();
if (inc >= '0' && inc <= '9') {
// если пришёл символ-цифра, добавляем его к сообщению
message += inc;
} else if (inc == ' ') {
// если пришел пробел, то поворачиваем серво на заданный угол
int agle = message.toInt();
if(agle > 180){agle = 180;}
if(agle < 0){agle = 0;}
servo.write(agle);
message = "";
}
}
}

В данном скетче мы вначале набираем угол (можно по одной цифре, можно сразу числом) и, после того, как мы введем пробел, двигатель повернется на указанный угол.

Максимальный угол поворота у данного мотора 180 градусов. И поэтому в скетче стоят проверки на то, чтобы угол был не больше 180 и не меньше 0 градусов.

Добавим к нашему серво дисплей (подробную информацию о том, как подключать дисплей, вы можете посмотреть в статье Подключение графического дисплея Nokia5110)

А теперь добавим отображение угла поворота на экране. Думаю, что следующий код вы сами сможете добавить в скетч, поэтому полный пример скетча не буду приводить.

 #include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);

// setup
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60);
display.setTextSize(2);

// loop
display.setCursor(0, 0);
display.clearDisplay();
display.print(agle);
display.display();

Последние приготовления завершены - сделаем последний штрих в нашей системе. Добавим управление углом с помощью матричной клавиатуры.

Вначале подключим нашу клавиатуру и протестим ее отдельно (подробно о подключении клавиатуры можно прочитать в данной статье). 

#include <Keypad.h>
#include <plcLib.h>

// массив с данными клавиатуры
char keyMap[4][4] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};

// пины клавиатуры (с 8 по 1)
// Обратите внимание на последовательность.
byte rowsPins[4] = { 50, 48, 46, 44 };
byte colsPins[4] = { 42, 40, 38, 36 };

Keypad key = Keypad( makeKeymap(keyMap), rowsPins, colsPins, 4, 4 );

void setup() {
Serial.begin(9600);
// стартовые настройки клавиатуры
setupPLC();
}

void loop()
{
// считываем нажатие клавиши
char isKeyPress = key.getKey();
if(isKeyPress){
Serial.println(isKeyPress);
}
}

После того, как убедимся в том, что клавиатура подключена правильно и все данные с нее вводятся, соберем наш конструктор вместе (думаю, что схему можно не выкладывать - их предостаточно в статьях про каждое из используемых нами устройств).

#include <Servo.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Keypad.h>
#include <plcLib.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);
Servo servo;

char keyMap[4][4] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};

byte rowsPins[4] = { 50, 48, 46, 44 };
byte colsPins[4] = { 42, 40, 38, 36 };

Keypad key = Keypad( makeKeymap(keyMap), rowsPins, colsPins, 4, 4 );


String message = "";
void setup()
{
setupPLC();
servo.attach(7)
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60);
display.setTextSize(2);
}

void loop()
{
char isKeyPress = key.getKey();
if(isKeyPress == 'A' || isKeyPress == 'B' || isKeyPress == 'C' || isKeyPress == 'D'){
// если нажаты буквенные клавиши ничего не делаем
return;
} else if(isKeyPress == '#'){
// # - сброс всех данных
display.clearDisplay();
display.display();
} else if(isKeyPress == '*'){
// * - поворот двигателя со всеми необходимыми проверками и выводом на экран
int agle = message.toInt();
if(agle > 180){agle = 180;}
if(agle < 0){agle = 0;}
display.clearDisplay();
display.print(agle);
display.display();
servo.write(agle);
message = "";
} else if(isKeyPress) {
// получаем угол поворота по одной цифре
if(message.length() == 0){
display.clearDisplay();
display.display();
}
message += isKeyPress;
display.print(isKeyPress);
display.display();
}
}

 

Теги: #Nokia5110, #Матричная клавиатура, #Arduino MEGA, #SG90

Ваша оценка:

Рейтинг: 9.9 (Оценок: 4)

Комментарии (1):

Serega
2016-07-22 13:39
Здравствуйте!
Мне очень понравилась Ваша статья про управление сервой!
Я новичок в работе с ардуино! Как написать программу (для работы с шаговым двигателем с ходовым винтом, энкодером от принтера, дисплеем 16х2, и матричной клавиатурой) чтобы на клавиатуре задать значение (в мм) и шаговик бы передвинул каретку в на введеное значение?
Есть отдельные скечи для работы с ЭНКОДЕРНОЙ ЛЕНТОЙ, МАТРИЧНОЙ КЛАВИАТУРОЙ 4Х3, ШАГОВИКОМ И ДИСПЛЕЕМ.
Если все эти скечи я смогу объеденить в один, но вот сама логика управления с клавиатура для меня сложновата в понимании!

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены