Запись на последовательный ЖК-дисплей, похоже, мешает работе сервоприводов
У меня есть проект Arduino на базе OBD (ссылка на адаптер OBD ниже), который использует два сервопривода и последовательный ЖК-дисплей от Sparkfun (ссылка ниже). Моя проблема: запись на ЖК-дисплей, похоже, мешает работе сервоприводов. Подробности:
1) Если исключить весь код, связанный с ЖК-дисплеем, сервоприводы работают плавно. 2) Если включен код, связанный с ЖК-дисплеем, но сервоприводы не подключены, на ЖК-дисплее все отображается нормально. 3) Когда включен код, связанный с ЖК-дисплеем, даже если сам ЖК-дисплей НЕ подключен, проблема возникает. Каждый раз, когда я пишу на ЖК-дисплей, слышен короткий шум от сервоприводов (сервоприводы не двигаются много, они просто издают короткий шум).
Есть идеи, что вызывает это? Ниже приведены соответствующие части кода (OBD, сервопривод, LCD):
#include <Arduino.h>
#include <Wire.h>
#include <OBD.h>
#include "MPU6050.h"
#include <SoftwareSerial.h>
#include <Servo.h>
int servoPin1=13;
int servoPin2=12;
Servo servo1;
Servo servo2;
COBDI2C obd;
SoftwareSerial lcd(2,3);
void clearDisplay() {
lcd.write(0xFE);
lcd.write(0x01);
}
void setLCDCursor(byte cursor_position) {
lcd.write(0xFE);
lcd.write(0x80);
lcd.write(cursor_position);
}
void Show() {
setLCDCursor(0);
lcd.print("Test");
}
void setup() {
lcd.begin(9600);
clearDisplay();
setLCDCursor(0);
lcd.print("OBD");
pinMode(servoPin1,OUTPUT);
pinMode(servoPin2,OUTPUT);
servo1.attach(servoPin1);
servo2.attach(servoPin2);
servo1.write(0);
delay(200);
servo2.write(100);
delay(200);
obd.begin();
conn=obd.init(PROTO_AUTO);
lcd.print("Connected");
Wire.begin();
}
void loop() {
conn=obd.readPID(PID_RPM,rpm);
if (condition) {
servo2.write(50);
delay(500);
servo1.write(100);
delay(500);
}
Show();
delay(1000);
}
OBD-адаптер Последовательный ЖК-дисплей
@MrSparkly, 👍1
2 ответа
Лучший ответ:
Вы используете SoftwareSerial, который отключает прерывания при отправке/получении, чтобы точно рассчитать интервалы между битами. Библиотека Servo может использовать аппаратные таймеры, но для работы с контактами 12 и 13 потребуются прерывания для «копирования» импульсов на эти контакты. Таким образом, копии будут искажены при записи в SoftwareSerial или чтении из него.
Я предлагаю использовать аппаратный последовательный порт (контакты 0 и 1) для связи с ЖК-дисплеями, который не отключает прерывания. В качестве альтернативы реализуйте сервопозиционирование с помощью аппаратных таймеров самостоятельно, которые (после настройки) не будут изменять ширину импульсов, если прерывания отключены.
Сигнал сервоуправления ШИМ генерируется в аппаратном обеспечении. Поэтому он должен быть стабильным, если его оставить в покое с достаточным питанием, несмотря на то, что делает код. Сервоприводы — это аналоговые устройства. Поэтому любое возмущение формы или длины волны может повлиять на сервопривод.
После того, как сервопривод достиг желаемого положения, отключите сигнал ШИМ, который для большинства сервоприводов просто оставит их неподвижными там, где они находятся.
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- Реализовать два процесса одновременно
- Вопрос о сервоприводе, включая дисплей последовательного монитора
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Черные квадраты дисплея Arduino 16x2
Спасибо. Я попробовал подключить провод данных ЖК-дисплея (розовый на схеме выше) к Tx или Rx (0 или 1) на UNO. Я удалил все ссылки на SoftwareSerial и заменил все вызовы "lcd." на "Serial." в приведенном выше коде, но я получаю мусор на ЖК-дисплее. Я пробовал разные скорости передачи данных 4800,9600,19200 = все мусор. Это правильный способ использовать аппаратный последовательный порт?, @MrSparkly
Для записи на ЖК-дисплей вам нужно использовать контакт 1 на плате (Tx). Не пытайтесь пробовать разные скорости передачи данных, если 9600 работал с SoftwareSerial, то он будет работать и с Hardware Serial. Возможно, вам придется отключить ЖК-дисплей от контакта 1 во время загрузки новых скетчей., @Nick Gammon