Угол поворота серво с клавиатуры не работает
- Войдите на сайт для отправки комментариев
Пт, 15/02/2019 - 16:48
Господа подскажите по скетчу, хочу заставить серво поворачивать на градус введенный с клавиатуры. Но мой скетч не пашет, подскажите ошибку.
#include <Keypad.h>
#include <Servo.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Servo servo;
int data = 0;
void setup()
{
Serial.begin(9600);
servo.attach(5);
servo.write(0);
}
void loop()
{
char key = keypad.getKey();
//Если клавиша цифра, то предыдущее значение увеличиваем на разряд, и добавляем новую цифру.
if(key){
if(isDigit(key)){
data = data*10 + key - 48;
}else{
//Если нажата не цифра -> поворачиваем на градус
servo.write(data);
}
}
}
Зайдя на новый для себя форум, необходимо первым делом не постить важнейший вопрос современности, а ознакомиться с правилами форума. Этим Вы сильно повысите свои шансы нормально влиться в сообщество и понизите шансы быть посланным "на" (или "в" - как Вам больше нравится).
Пожалуйста, ознакомьтесь, и перепостите свой пост (можно здесь же, не обязательно плодить темы).
А без клавиатуры с заданными значениями поворачивает? (Что-то сомнения меня одолевают)
Да, поворачивает.
Обращаю Ваше внимание на #1 - там действительно полезная для жизни на форуме инфа.
По теме: Значение data перед servo.write проверяли?
T.Rook, всем понятно в чем дело, но не потворствуйте, плиз.
T.Rook, всем понятно в чем дело, но не потворствуйте, плиз.
Ну что Вы, я правда хочу подтолкнуть ТС к решению.... никогда не смеюсь на вопросами.
Многие хотят. Пусть хоть что-нибудь сделает правильно для начала, а мы в долгу не останемся.
#include <Keypad.h> #include <Servo.h> //Объявляем состав клавиатуры const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; //Указываем к каким пинам подключаются колонны и строки byte rowPins[ROWS] = {13, 12, 11, 10}; byte colPins[COLS] = {9, 8, 7, 6}; //Объявляем клавиатуру Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //Объявляем сервопривод Servo servo; //объявляем накопительную переменную data для ввода чисел содержащих больше одного разряда int data = 0; void setup() { //запускаем порт для клавиатуры Serial.begin(9600); //указываем на каком пине сервопривод servo.attach(5); // ставим серво в дефолтное положение, потом оно будет равняться 60 градусам. servo.write(0); } void loop() { // объявляем строковую переменную для получения значения с клавиатуры char key = keypad.getKey(); //Если клавиша получена, то if(key){ if(isDigit(key)){ //если значение строковой переменной полученой нажатием клавиши цифра, то data = data*10 + key - 48; //key - 48 через ASCII переводит цифру строковую в число. предыдущее значение Data //увеличивается на порядок, что позволяет записать число по разрядам }else{ //Если нажата не цифра, то есть конец ввода -> поворачиваем на градус servo.write(data); } } }Заглавными буквами написано по ссылке ЕвгенияП: ВСТАВКА ПРОГРАММНОГО КОДА. Кликните.
Да, почему-то не происходит считывание с клавиатуры. Я уже менял getKey на waitForKey, т.к. была мысль, что если не проходит нажатие, то просто data каждый цикл умножается на 10 и получаются градусы вне диапазона. Но c waitForKey тоже не работает.
Исправил.
Давайте попробуем ещё раз.
Пожалуйста, ознакомьтесь, и перепостите свой пост как положено.
Если Вы даже с подсказки не можете понять как правильно вставляется код, то, боюсь, ...
Ознакомился, исправил, раскаиваюсь.
В строке 42 вставляйте Serial.println(data);
Заливайте прошивку, открывайте Serial Monitor и смотрите в него, жмакая кнопки. Что там пишется?
Пишет:
Далее не реагирует на нажатия.
Пишет одно и то же каждый раз, когда вы нажимаете на разные кнопки?
Нет. Я запускаю, он тут же пишет 1 без нажатия. И потом никак не реагирует на нажатие.
Нет. Я запускаю, он тут же пишет 1 без нажатия. И потом никак не реагирует на нажатие.
А так поиск и продолжайте. Вывод data в порт ещё и перед 45-й строкой вставьте. И на всякий случай ссылку на используемую библиотеку Keypad приведите. Они разные, вдруг чего используете не так!
У меня закрались подозрения, что проблема в эмуляторе. Т.к. я нищеброд и ардуино с серво нет, то использую Tinkercad. Возможно проблема в этом.
Ссылка на библиотеку https://playground.arduino.cc/Code/Keypad
Вставил после 37 строки. Цикл крутит, сплошные единицы в выводе.
Вставил после 39. На выводе только
То есть нет сигнала с клавиатуры.
Ну за Tinkercad ничего не скажу, никогда не пользовался. Должен он работать или не должен - чёрт его знает. Только в следующий раз о том, что с эмулятором работаете - сразу говорите.
Попробуйте в нём сначала самые простейшие скетчи из примеров к библиотеки клавиатуры, заствьте их работать.
За ThinkerCad я скажу. SoftwareSerial в нём глючит точно. Он не работает в ThinkerCad, но работает в железе.
добавить кнопка Enter
Роза, Enter там не нужен и его на данной клавиатуре нет.
#include <Keypad.h> #include <Servo.h> #define INPUTIDLE 0 #define INPUTVALUE 1 #define SETANGEL 2 #define KEYENTER '*' #define KEYRESET '#' #define KEYDIGIT '0'...'9' const byte NOANGLE = 255; const byte MAXANGLE = 180; const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { { '1', '2', '3', 'A' }, { '4', '5', '6', 'B' }, { '7', '8', '9', 'C' }, { '*', '0', '#', 'D' } }; byte rowPins[ ROWS ] = { 12, 11, 10, 8 }; //connect to the row pinouts of the keypad byte colPins[ COLS ] = { 7, 6, 5, 4 }; //connect to the column pinouts of the keypad //initialize an instance of class NewKeypad Keypad customKeypad = Keypad( makeKeymap( hexaKeys ), rowPins, colPins, ROWS, COLS ); Servo customServo; void setup() { Serial.begin( 9600 ); customServo.attach(9); // attaches the servo on pin 9 to the servo object } byte getangle() { static uint16_t inangle; static byte outangle; char key; key = customKeypad.getKey(); if ( key != NO_KEY ) { switch ( key ) { case KEYDIGIT: inangle = inangle * 10 + ( key - '0' ); if ( inangle <= MAXANGLE ) { outangle = inangle; } else { inangle = 0; } break; case KEYENTER: inangle = 0; return outangle; break; case KEYRESET: inangle = 0; break; } } return NOANGLE; } void loop() { byte servodegrees = getangle(); if ( servodegrees != NOANGLE ) { Serial.print( "the servo motor position = " ); Serial.println( servodegrees ); customServo.write( servodegrees ); } }Спасибо, ваше решение очень помогло.
Возник другой вопрос. Тайминги на поворот на моих серво не совпадает с таймингами в библиотеке Servo.h.
Есть ли альтернативная библиотека, где можно задать свои тайминги сигнала на поворот?
Возможно ли поменять в библиотеке Servo.h вот эти параметры, обозвав библиотеку подругому?
Или может как-то добавить переменные для настройки?
Вот такой кусок нашел в Серво.х
uint8_t Servo::attach(int pin) { return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); } uint8_t Servo::attach(int pin, int min, int max) { ... }Просто делайте attach() со своими min/max.
можно
Правильно ли я понимаю, что при объявлении надо сделать:
void setup() { Serial.begin( 9600 ); customServo.attach(9, 500, 2500); // attaches the servo on pin 9 to the servo object }Правильно ли я понимаю, что при объявлении надо сделать:
void setup() { Serial.begin( 9600 ); customServo.attach(9, 500, 2500); // attaches the servo on pin 9 to the servo object }правильно