Как стать автором
Поиск
Написать публикацию
Обновить

USB LCD дисплей за меньше чем 10$ DIY

Как-то недавно познакомился с микропроцессорной техникой, в частности c Arduino. Прикупил себе небольшой дисплей, без него сейчас никуда. Попробовал выводить текст из терминала — всё отлично работало. Ну и как-то закинул на всё это дело, то времени не было, то желания… а если одним словом — лень.



Ну и как-то на просторах хаба попалась такая статья. Довольно интересная, спасибо автору, именно она меня и вдохновила. Ну и думаю а почему бы и нет? Что есть 5 долларов?

Ехал LaunchPad около двух недель. А что наибольшие привлекало это то, что среда программирования очень похожая на Arduino IDE, причём не только само окно смотрится как две капли воды, за исключением цвета, сами оцените:



Синтаксис почти один в один, за исключением некоторых деталей. Скачать последнюю версию Energia можно тут.

Так вот, проделал я с MSP-EXP430G2 всё тоже что раньше из Arduino, никаких проблем почти не возникало, разве только то, что когда я делал вольтметр для литиевой батарейки, так чисто для интереса как и что, я не учёл то что MSP-EXP430G2 в отличии от Arduino имеет предельное напряжение на порту не 5.0 а 3.5 Вольт. Не то что я не учёл, я просто не знал, а батарейка то была полностью заряжена, а это равно 4.10 Вольт… вот сижу и подаю смертельные 4.1 Вольта на порт у гадаю, почему же мне в serial пишет 5.0, кстати скетч я использовал от Arduino. Перекинул на другой порт — там тоже самое… перекинул назад на тот что был первым, так тот вообще ничего уже не выводил, сколько не подавай на него. Это уже потом более опытные люди мне объяснили что в MSP-EXP430G2 не 5 Вольт логическая единица а 3.5 Вольт. Вот так я и понял что означает «сжечь порт». Так что будьте бдительней, не наступайте на те же грабли. После этого я решил немного почитать об MSP-EXP430G2. Ну и из всего прочитанного мне больше всего понравилось этот материал, как для новичка самое оно.
Попробовал сделать тоже что и на Arduino делал раньше, всё отлично работало. В MSP-EXP430G2 в отличии от Arduino есть интегрированный в микросхему температурный датчик, я сделал простенький usb/LCD градусник.
Градусник
// include the library code:
#include <LiquidCrystal.h>
byte Char1[8]={
 B00100,
 B01010,
 B00100,
 B00000,
 B00000,
 B00000,
 B00000,
 B00000}; // символ градус
LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);  // RS, E, DB4, DB5, DB6, DB7
void setup() {
  Serial.begin(9600); 
  lcd.createChar(1, Char1);
  lcd.begin(16, 2);
  lcd.print("Temp sensor :)"); 
  delay(2000); 
  pinMode(RED_LED, OUTPUT);  
}
void loop() {
  delay(1000); 
  digitalWrite(RED_LED, HIGH);  
  lcd.clear();
  lcd.setCursor(0, 0);  
  int sensorValue = ((analogRead(A10) - 630) * 760) / 1024; // преобразуем в градусы цельсия
  Serial.print(sensorValue);
  Serial.print(" \xb0");
  Serial.print("C");
  Serial.println( );
  digitalWrite(RED_LED, LOW);   // мигаем светодиодом когда данные отправляются в Serial
  lcd.print("* Temp is ");  
  lcd.print(sensorValue ); 
  lcd.print("\1C *");  
}


Ну и захотелось чего-то действительно полезного, давно хотел себе сделать LCD дисплей, чтобы выводил всякую инфу о состоянии моего ПК.
Походил по хабу и наткнулся на такую статейку, значит есть шанс что подобное сможет работать и на MSP-EXP430G2. Попробовал мигать встроенным диодом при помощи команд в serial и всё отлично работало, думаю и с дисплеем справится. Но увы автор статьи не написал программу для Windowsа. После очередного похода в гугл я узнал что есть такая замечательная бесплатная программа как LCD Smartie качнул последнюю версию, выбрал в настройках testdriver.dll, чисто интуитивно, и прописал номер COM-порта MSP-EXP430G2 а для контроллера я написал простенький скетч который считывал данные приходящие из COM-порта и выводил их на LCD дисплей.
lcd.write(Serial.read()):
#include <LiquidCrystal.h>
LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);  // RS, E, DB4, DB5, DB6, DB7
void setup(){
  lcd.begin(16, 2);
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available()) {
    delay(100);
    lcd.clear();
    while (Serial.available() > 0) {
      lcd.write(Serial.read());
    }
  }
}

О чудо что-то отображается, но совсем не так как нужно, нормально можно выводить только одну строчку, но мой дисплей имеет две… так не пойдёт, одного lcd.write(Serial.read()) будет маловато… Ну думаю пойду опять спрошу у гугла, может что-то подкинет…
Подкинул вот это на видео все работало, только нужно в настройках LCD Smartie поставить matrix.dll ну и про номер COM-порта незабываем. Но не все так просто, выводить инфу тот скетч никак не хотел, странно что на видео все работает, у меня и не только у меня выводились какие-то цифры, как на MSP-EXP430G2 так и на Arduino. Как всегда помогли на форуме, мир не без добрых людей в итоге вот рабочий скетч для MSP-EXP430G2:
**LCD SMARTIE**
// include the library code:
#include <LiquidCrystal.h>

// these constants won't change.  But you can change the size of
// your LCD using them:
const int numRows = 2;
const int numCols = 16;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);
// RS, RW, 4,5,6,7 (Refer to the back of your LCD for details)
// E на землю


// для Arduino: 
//LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
// RS, RW, E, 4,5,6,7 
// обратите внимание E на 10
void setup() { 
  Serial.begin(9600);
  // set up the LCD's number of rows and columns: 
  lcd.begin(numRows, numCols);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("**LCD  SMARTIE**");
  lcd.setCursor(0,1);
  lcd.print("LaunchPad MSP430");
  //lcd.print("on Arduino");
}

byte serial_getch(){

  int incoming;  
  while (Serial.available()==0){
  }
  // read the incoming byte:
  incoming = Serial.read();

  return (byte) (incoming &0xff);
}

void loop(){

  byte rxbyte;
  byte temp;

  rxbyte = serial_getch();

  if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
  {
    switch (serial_getch())
    {
    case 66: //backlight on (at previously set brightness)
      // not implemented				

      break;
    case 70: //backlight off
      // not implemented				
      break;
    case 71:  //set cursor position
      temp = (serial_getch() - 1);  //get column byte
      switch (serial_getch())  //get row byte
      {
        //line 1 is already set up
      case 2:
        temp += 0x40;
        break;
      case 3:
        temp += 0x14;
        break;
      case 4:
        temp += 0x54;
        break;
      default:
        break;
      }
      lcd.command(0b10000000 + temp);
      break;
    case 72:  //cursor home (reset display position)
      lcd.command(2);
      break;
    case 74:  //show underline cursor
      lcd.command(0b00001110);
      break;
    case 75:  //underline cursor off
    case 84:  //block cursor off
      lcd.command(0b00001100);
      break;
    case 76:  //move cursor left
      lcd.command(16);
      break;
    case 77:  //move cursor right
      lcd.command(20);
      break;
    case 78:  //define custom char
      lcd.command(64 + (serial_getch() * 8));  //get+set char address
      for (temp = 7; temp != 0; temp--)
      {
        lcd.print((char)serial_getch()); //get each pattern byte
      }
      break;
    case 83:  //show blinking block cursor
      lcd.command(0b00001111);
      break;
    case 86:  //GPO OFF
      //implement later
      break;
    case 87:  //GPO ON
      /*temp = serial_getch();
       				if (temp == 1)
       				{
       					GPO1 = GPO_ON;
       				}*/
      break;
    case 88:  //clear display, cursor home
      lcd.command(1);
      break;
    case 152: //set and remember (doesn't save value, though)
    case 153: //set backlight brightness
      //not implemented
      break;

      //these commands ignored (no parameters)
    case 35: //read serial number
    case 36: //read version number
    case 55: //read module type
    case 59: //exit flow-control mode
    case 65: //auto transmit keypresses
    case 96: //auto-repeat mode off (keypad)
    case 67: //auto line-wrap on
    case 68: //auto line-wrap off
    case 81: //auto scroll on
    case 82: //auto scroll off
    case 104: //init horiz bar graph
    case 109: //init med size digits
    case 115: //init narrow vert bar graph
    case 118: //init wide vert bar graph
      break;
    default:
      //all other commands ignored and parameter byte discarded
      temp = serial_getch();  //dump the command code
      break;
    }
    return;
  } //END OF COMMAND HANDLER

  //change accented char to plain, detect and change descenders
  //NB descenders only work on 5x10 displays. This lookup table works
  //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
  switch (rxbyte)
  {
    //chars that have direct equivalent in LCD charmap
    /*		case 0x67: //g
     			rxbyte = 0xE7;
     			break;
     		case 0x6A: //j
     			rxbyte = 0xEA;
     			break;
     		case 0x70: //p
     			rxbyte = 0xF0;
     			break;
     		case 0x71: //q
     			rxbyte = 0xF1;
     			break;
     		case 0x79: //y
     			rxbyte = 0xF9;
     			break;
     */  case 0xE4: //ASCII "a" umlaut
    rxbyte = 0xE1;
    break;
  case 0xF1: //ASCII "n" tilde
    rxbyte = 0xEE;
    break;
  case 0xF6: //ASCII "o" umlaut
    rxbyte = 0xEF; //was wrong in v0.86
    break;
  case 0xFC: //ASCII "u" umlaut
    rxbyte = 0xF5;
    break;

    //accented -> plain equivalent
    //and misc symbol translation
  case 0xA3: //sterling (pounds)
    rxbyte = 0xED;
    break;
    /*		case 0xB0: //degrees symbol
     			rxbyte = 0xDF;
     			break;
     */  case 0xB5: //mu
    rxbyte = 0xE4;
    break;
  case 0xC0: //"A" variants
  case 0xC1:
  case 0xC2:
  case 0xC3:
  case 0xC4:
  case 0xC5:
    rxbyte = 0x41;
    break;
  case 0xC8: //"E" variants
  case 0xC9:
  case 0xCA:
  case 0xCB:
    rxbyte = 0x45;
    break;
  case 0xCC: //"I" variants
  case 0xCD:
  case 0xCE:
  case 0xCF:
    rxbyte = 0x49;
    break;
  case 0xD1: //"N" tilde -> plain "N"
    rxbyte = 0x43;
    break;
  case 0xD2: //"O" variants
  case 0xD3:
  case 0xD4:
  case 0xD5:
  case 0xD6:
  case 0xD8:
    rxbyte = 0x4F;
    break;
  case 0xD9: //"U" variants
  case 0xDA:
  case 0xDB:
  case 0xDC:
    rxbyte = 0x55;
    break;
  case 0xDD: //"Y" acute -> "Y"
    rxbyte = 0x59;
    break;
    /*		case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
     			rxbyte = 0xE2;
     			break;
     */  case 0xE0: //"a" variants except umlaut
  case 0xE1:
  case 0xE2:
  case 0xE3:
  case 0xE5:
    rxbyte = 0x61;
    break;
  case 0xE7: //"c" cedilla -> "c"
    rxbyte = 0x63;
    break;
  case 0xE8: //"e" variants
  case 0xE9:
  case 0xEA:
  case 0xEB:
    rxbyte = 0x65;
    break;
  case 0xEC: //"i" variants
  case 0xED:
  case 0xEE:
  case 0xEF:
    rxbyte = 0x69;
    break;
  case 0xF2: //"o" variants except umlaut
  case 0xF3:
  case 0xF4:
  case 0xF5:
  case 0xF8:
    rxbyte = 0x6F;
    break;
  case 0xF7: //division symbol
    rxbyte = 0xFD;
    break;
  case 0xF9: //"u" variants except umlaut
  case 0xFA:
  case 0xFB:
    rxbyte = 0x75;
    break;
  default:
    break;
  }

  lcd.print((char)rxbyte);  //otherwise a plain char so we print it to lcd
  return;
}


В шапке я закомментировал как запустить данный скетч на Arduino, но зачем? если есть MSP-EXP430G2 за 5 баксов.
Плагины для LCD Smartie ищите тут или на просторах рунета.



Видео:

http://www.youtube.com/watch?v=CqSSk4EUBNA

Автор HWman.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.