Ребят, тут такой вопрос, купил как- то индикатор Мэлт MT-12232B-2FLA http://www.melt.com.ru/shop/mt-12232b-2ylg-2.html, а подключить грамотно к Дуньке не могу. Есть у кого опыт работы с таким индикатором?
Здравствуйте. Задам вопрос тут. Есть собранная и рабочая схема с экраном 20х4 на движущемся роботе - хеллоуворлд по ссылке запускается без нареканий при всех тех же самых подсоединенных проводах и датчиках . Но когда я запускаю свой код - вместо нужных сообщений отображается смайл Я_я, плывущий по экрану. Я не знаю, что делать - все pinMode - команды, лежавшие ранее на пинах к экрану, поубивал (они давали более жесткие глюки на экран), особых косяков не вижу, код компилируется, но нужные символы не высвечиваются. Код прилагаю. Посмотрите, ну пожаааалуйста или какие-то соображения у вас - может, "было подобное, когда"? Код (Text): #include <SoftwareSerial.h> #include <URMSerial.h> #include <LiquidCrystal.h> LiquidCrystal lcd(13, 10, 0, 1, 2, 9); URMSerial urm; int value; int getMeasurement() { switch(urm.requestMeasurementOrTimeout(DISTANCE, value)) // Find out the type of request { case DISTANCE: return value; break; case TEMPERATURE: return value; break; case ERROR: Serial.println("Error"); break; case NOTREADY: Serial.println("Not Ready"); break; case TIMEOUT: Serial.println("Timeout"); break; } return -1;} // // int irsl = A1; int irsr = A2; int E1 = 5; int M1 = 4; int E2 = 6; int M2 = 7; // // void MESSAGE () { // печатаем первую строку lcd.print("print text"); // устанавливаем курсор в колонку 0, строку 1. То есть на xB7\x61\xBE\x79\x63\xBA\x61\x20\x70\x6f\xB2\x67\xBF\x61 // самом деле это вторая строка, т.к. нумерация начинается с нуля \xB3\xBA\xBB\xC6\xC0\xB8\xBF\x65\x20\xBF\x79\xBC\xB2\xBF\x65\x70" lcd.setCursor(0, 1); // печатаем вторую строку lcd.print("you bastard"); delay (500); lcd.clear(); } void BACKW () { digitalWrite(M1,LOW); digitalWrite(M2, LOW); analogWrite(E1, 250); analogWrite(E2, 250); } void LTURN () { digitalWrite(M1, HIGH); digitalWrite(M2, LOW); analogWrite(E1, 250); //PWM Speed Control analogWrite(E2, 250); delay(100); } void RTURN () { digitalWrite(M1, LOW); digitalWrite(M2, HIGH); analogWrite(E1, 250); //PWM Speed Control analogWrite(E2, 250); delay(100); } void CORNER () { int disl = analogRead(irsl); int disr = analogRead(irsr); // записываем аналоговые данные с ИК-сенсоров tone(11, 3000, 100); // издаем звук if (disr>disl && disr>300) { BACKW (); //PWM Speed Control delay (500); // на выполнение маневра отводим полсекунды - достаточно для разворота RTURN (); delay (500); } else { if (disr<disl && disl>300) { BACKW (); //PWM Speed Control delay (500); // на выполнение маневра отводим полсекунды - достаточно для разворота LTURN (); delay (500); } else { BACKW (); //PWM Speed Control delay (800); // на выполнение маневра отводим полсекунды - достаточно для разворота RTURN (); delay (800);} noTone (11); } } void FORWARD () { digitalWrite(M1,HIGH); //едем digitalWrite(M2, HIGH); // вперед analogWrite(E1, 250); //PWM Speed Control analogWrite(E2, 250); } void IDLE () { MESSAGE (); digitalWrite(M1, LOW); digitalWrite(M2, LOW); analogWrite(E1, 0); //PWM Speed Control analogWrite(E2, 0); delay (500); } void RIDE() { value = getMeasurement (); int disl = analogRead(irsl); int disr = analogRead(irsr); if (value<15) { CORNER (); } else { if (disr > 250 && disl > 250 ) // если расстояние с правого И левого сенсора малое, то { CORNER ();} else { if (disl > 300) // если слева препятствие согласно ИК-сенсору { RTURN (); } else { if (disr > 300) // аналогично предыдущему блоку - но помеха справа, зеркально { LTURN (); } else { FORWARD (); delay (200); } } } } } void setup() { Serial.begin(9600); // Sets the baud rate to 9600 urm.begin(3,12,9600); // RX Pin, TX Pin, Baud Rate lcd.begin(20, 4); pinMode(M1, OUTPUT); // назначаем пин M1 как выдающий напряжение для моторов pinMode(M2, OUTPUT); // назначаем пин M1 как выдающий напряжение для моторов // pinMode (9, OUTPUT); // пины 9 и 10 также назначаем как выдающие напряжение, // pinMode (10, OUTPUT); //их используем для светодиодов pinMode (8, INPUT); //pinMode (12, INPUT); //pinMode (3, INPUT); //pinMode (A1, INPUT); //pinMode (A2, INPUT); //pinMode (13, OUTPUT); //pinMode (0, INPUT); //pinMode (1, INPUT); //pinMode (2, INPUT); //pinMode (9, INPUT); } void loop() { value = getMeasurement(); Serial.println("Measurement: "); Serial.println(getMeasurement()); // Output measurement if (digitalRead(8) == LOW) {IDLE ();} else { RIDE (); } }
Перепутаны номера пинов и направления в pinMode. Пины 0 и 1 лучше оставить свободными. Внимательно посмотрите пример работы с дисплеем в Вики и сравните со своей схемой и кодом.
Я смотрел вики и внимательно смотрел мануал к экрану на предмет распиновки - на 20х4 экране она отличается от 16х2. Пинмоды и диджиталрайты я все закоментил/убрал, они ведь не срабатывают. А вот насчет 0 и 1 поясните поподробнее? Я заметил, что они промаркированы RX и TX, как ультразвуковой датчик URM37. Но в некоторых примерах к ним подключаются соответственные пины этого датчика, а в моем простом случае при подключении через библиотеку от майлс бёртона в примере эти 0 и 1 пины на ардуине тоже оставлены свободными. Я их использовал только потому, что тупо не хватает слотов - 6 жрет экран и еще 4- моторы, а нужна еще пищалка, тумблер...
Их можно использовать, но следует помнить, что на UNO все, что Serial, идет через них. Т.е. либо что-то вешать на них, но отказаться от Serial и обмена через USB, либо обмен через USB, но ничего не вешать на эти пины. А если пинов не хватает, то можно использовать кучу вариантов от http://robocraft.ru/blog/arduino/518.html до http://arduino-ua.com/prod578-Rasshiritel_portov_Arduino И на экране можно сэкономить два пина, подключив его через сдвиговый регистр.