Экран и Arduino

Тема в разделе "Arduino & Shields", создана пользователем Дмитрий Тимошенко, 6 янв 2014.

  1. Ребят, тут такой вопрос, купил как- то индикатор Мэлт MT-12232B-2FLA http://www.melt.com.ru/shop/mt-12232b-2ylg-2.html, а подключить грамотно к Дуньке не могу. Есть у кого опыт работы с таким индикатором?
     
  2. Unixon

    Unixon Оракул Модератор

    По ссылке есть примеры кода, попробуйте переделать MT-12232B.c под ардуину.
     
  3. Turder

    Turder Нуб

    Здравствуйте. Задам вопрос тут.
    Есть собранная и рабочая схема с экраном 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 ();
    }
    }
     
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Перепутаны номера пинов и направления в pinMode.
    Пины 0 и 1 лучше оставить свободными. Внимательно посмотрите пример работы с дисплеем в Вики и сравните со своей схемой и кодом.
     
  5. Turder

    Turder Нуб

    Я смотрел вики и внимательно смотрел мануал к экрану на предмет распиновки - на 20х4 экране она отличается от 16х2. Пинмоды и диджиталрайты я все закоментил/убрал, они ведь не срабатывают. А вот насчет 0 и 1 поясните поподробнее? Я заметил, что они промаркированы RX и TX, как ультразвуковой датчик URM37. Но в некоторых примерах к ним подключаются соответственные пины этого датчика, а в моем простом случае при подключении через библиотеку от майлс бёртона в примере эти 0 и 1 пины на ардуине тоже оставлены свободными.
    Я их использовал только потому, что тупо не хватает слотов - 6 жрет экран и еще 4- моторы, а нужна еще пищалка, тумблер...
     
  6. geher

    geher Гуру

    Их можно использовать, но следует помнить, что на UNO все, что Serial, идет через них. Т.е. либо что-то вешать на них, но отказаться от Serial и обмена через USB, либо обмен через USB, но ничего не вешать на эти пины.
    А если пинов не хватает, то можно использовать кучу вариантов от
    http://robocraft.ru/blog/arduino/518.html
    до
    http://arduino-ua.com/prod578-Rasshiritel_portov_Arduino

    И на экране можно сэкономить два пина, подключив его через сдвиговый регистр.