ELM327とArduinoとLCD2004でOBDデータ表示

はじめに ELM327とArduinoとLCD2004で車両情報を表示してみました。 ELM327ではTrqueやCar Scannerなどのアプリで色々な車両情報は見れますが、だいたい見る項目は決まってきましたので作ってみました。 アプリより表示のレスポンスが向上しました。 「Arduino ELM327」などでググると、以下のELMduinoのような便利なライブラリも見つかりましたが、今回は使っていません。 PowerBroker2/ELMduino: Arduino OBD-II Bluetooth Scanner Interface Library for Car Hacking Projects 使ったもの ELM327 v1.5 Arduino UNO R2 Arduino Pro mini互換品 ATMega328,16MHz,5V LCD2004とI2Cアダプタ こちらと同じもの → Arduino I2C LCD2004 HelloWorld | atooshi-note ELM327殻割り 基板は3段構成になっていて一番上の青い基板はBluetooth Module(BTM)です。 BTMのチップ印字消されていますが、いろいろググってみるとHC-05のコンパチ?っぽそうです。 モジュールは3.3Vで駆動されていますが、typは3.6~6Vらしいですね。 RT,TX,3.3V,GND,5Vは以下の位置関係のようです。 参考 アナログタコメータをつくる(1) OBD2スキャナ ArduinoとELM327でOBD取得する 接続 ELM327はスマホで動作確認はできていますので、PCとシリアル通信してみます。 USB-TTLデバイスを用意して、以下のように接続します。 ELM327 USB-TTL 5V 5V GND GND TX RX RX TX 通常は定番のFTDIの石を使うと思いますが、持っていないのでCH32V003用に持っているWCH-LinkEを使いました。 COMポートとして認識されるデバイスなら通信できそうです。 Arduino UNO R2のUSB-シリアル変換部分も同じように使うことができます。その場合、以下のように接続します。 ArduinoのTX(pin1)はUSB-シリアル変換部分のRXに、RX(pin0)はTXに繋がっているので、クロス接続にはしません。 以下↓にも記載しています。 NCP-HG100 を 楽天モバイル Band3 に固定する | atooshi-note ...

2025/02/08 · Last updated on 2025/03/23 · 8 min · 1580 words

Arduino I2C LCD2004 LiquidCrystal_I2C.h不使用

はじめに LiquidCrystal_I2C.hを使わず、LCD2004でHello Worldしました。 前回記事では、LiquidCrystal_I2C.hを使用してLCDを制御しました。 LCD2004やI2Cアダプタについては前回記事を御覧ください。同じものを使用します。結線も同じです。 Arduino I2C LCD2004 HelloWorld | atooshi-note ArduinoでLCDを制御する例を調べるとLiquidCrystal_I2C.hを使った記事がたくさんヒットしますが、LiquidCrystal_I2C.hを使わない例はあまり見かけませんでした。 RaspberrypiやPICやSTM32で駆動している例はそこそこ見つかりました。 気をつける点(自分めも) LiquidCrystal_I2C.hを使わない例としてはACM1602NIを駆動している例がありました。これもI2C接続ですが、LCDモジュールとI2Cアダプタがセットになっています。今回私が使用しているのはLCDとI2Cアダプタ(PCF8574T)が別で接続したものですのでプログラムそのままでは動きません。 以下はLiquidCrystal_I2C.hがいい感じにやってくれていますが、自分で組むときに気をつけた点です。 適切なディレイが必要 初期化手順が決まっている 4bitモードで制御する enable信号のL→H→Lは0.22us以上あける PCF8574TとLCD2004の結線 LCD DB7 DB6 DB5 DB4 バックライトのトランジスタのGate E R/W RS PCF8574T P7 P6 P5 P4 P3 P2 P1 P0 プログラム /* wire.h使用(i2c) #include <LiquidCrystal_I2C.h>は不使用 */ #include <Wire.h> #define lcdaddr 0x27 #define lcdEN 0b00000100 // Enable #define lcdBL 0b00001000 // Back light ON #define setDDRAMaddr 0b10000000 // Set DDRAM Address #define setRS 0b00000001 // RS=1 #define unsetRS 0b00000000 // RS=0 void lcdinit() { // 一旦8bitモードに設定(3回繰り返す) // 1回目 lcdwrite0(0x30,unsetRS); // Funcition Set DL=1:8bitバス delay(5); // Wait for more than 4.1 ms // 2回目 lcdwrite0(0x30,unsetRS); delayMicroseconds(150); // Wait for more than 100 µs // 3回目 lcdwrite0(0x30,unsetRS); delayMicroseconds(100); // Wait for more than 40 µs lcdwrite0(0x20,unsetRS); // 4bitモードに設定 Funcition Set DL=0:4bitバス lcdwrite(0x28,unsetRS); // 2行表示モードに設定 Funcition Set DL=0:4bitバス,Set N=1:2桁表示 lcdwrite(0x0F,unsetRS); // 表示ON/OFF D=1:文字表示ON,C=1:下線カーソルON,B=1:ブロックカーソルON lcdwrite(0x06,unsetRS); // エントリモードセット I/D=1:インクリメント lcdwrite(0x01,unsetRS); // 表示クリア lcdwrite(0x02,unsetRS); // カーソルホーム } // 8bit用 void lcdwrite0(byte bits,byte mode){ i2cwrite(bits | mode); } // 4bit用 void lcdwrite(byte bits,byte mode){ i2cwrite((bits & 0xF0) | mode); // 上位4bit i2cwrite(((bits << 4) & 0xF0) | mode); // 下位4bit } void i2cwrite(byte val){ Wire.beginTransmission(lcdaddr); Wire.write(val | lcdBL); delayMicroseconds(1); // 0.22us以上 Wire.write(val | lcdBL | lcdEN); delayMicroseconds(1); // 0.22us以上 Wire.write(val | lcdBL); Wire.endTransmission(); delayMicroseconds(100); // Wait for more than 40 µs とは言いつつ50usec待ちでは動かない 100usecぐらい余裕を持っておく } // row:行 col:列 void setCursor(int row, int col){ int row_offsets[] = {0x00, 0x40, 0x14, 0x54}; // 0から数え始め lcdwrite((col + row_offsets[row]) | setDDRAMaddr,unsetRS); } void lcdText(String s){ for(int i = 0; i < s.length(); i++){ lcdwrite(s.charAt(i),setRS); } } void setup() { delay(50); // Wait for more than 15 ms after VCC rises to 4.5 V Wire.begin(); lcdinit(); setCursor(0,0); // カーソルを0行目0列目に移動 lcdwrite(0x30,setRS); // 数字の0を出力 HD44780 Table 4 Correspondence between Character Codes and Character Patterns (ROM Code: A00) setCursor(1,1); lcdwrite(0x31,setRS); // 数字の1を出力 setCursor(2,2); lcdText("2_hello world!"); } void loop() { setCursor(3,0); lcdText("3_Hello World!"); delay(1000); setCursor(3,0); lcdText("3_World!"); delay(1000); } 結果 ...

2025/02/04 · Last updated on 2025/03/13 · 2 min · 325 words

Arduino I2C LCD2004 HelloWorld

はじめに 20桁×4行のLCD LCD2004をArduinoで制御してHelloWorldしました。 検索するとよくヒットするLiquidCrystal_I2C.hを使用するタイプです。 使ったもの LCD2004 I2Cアダプタ(PCF8574T) Arduino UNO R2 LCD2004 アリエクで以下のLCDを1500円程度で購入しました。I2Cアダプタ付きです。 ビッグサイズを謳っており、iPhone12miniと同じくらいのサイズです。 https://ja.aliexpress.com/item/1005007298503814.html LCDの制御ICは商品説明に hd44780,st7066,eqvチップ とあるので、業界標準になっている日立の超ロングセラー液晶コントローラーであるHD44780の互換ICが載っていると思われます。 I2CアダプタとLCDははんだ付けされておらず、別々で届きました。 LCDは18pinで以下のピンアサインになっています。 I2Cアダプタは16pinなので、pin1から合わせて、pin17,18がNCとなります。 I2Cアダプタ基板の表面しかパターンを追えてませんが、おそらく回路は以下記事と同じと思われます。 PCF8574Tを使ったLCD制御 DB0 から DB3は未接続で、DB4 から DB7は繋がっているため4bitモードだと思われます。 I2Cアダプタ(PCF8574T) PCF8574TはI2C接続のI/Oエキスパンダです。 青いポテンショメーター下のA0,A1,A2の空きランドでI2Cのスレーブアドレスを決定しますが、デフォルトでは3つとも開放なのでアドレスは0x27となります。 PCF8574Tのデータシートの7.1.1 Address mapsをみるとI2Cアドレス(A0から6の7bit)のA0,A1,A2がHIGH(開放でVDDとなりHIGH)となり、7-bit hexadecimal address without R/Wが27h(=0x27)となることがわかります。A3~6のbitは固定です。 Arduino IDEのスケッチ例-Wire-i2c_scanner.inoを使用して、アドレスが0x27であることが確認できました。 他のデバイス(STM32など)はアドレスはR/Wも含めた8bitで送信しますが、ArduinoはR/Wを含めず7bitです。Wire.hがそのようになっています。(LiquidCrystal_I2C.hではWire.hを使用しています) また、I2Cは信号線のプルアップが必要ですが、Wire.hでは内部プルアップしてくれるので外付け抵抗が不要です。 なので、ただ線をつなぐだけでOKです。 接続 ArduinoとI2Cアダプタを4本接続するだけです。 Arduino UNO R2 I2Cアダプタ A4(SDA) SDA A5(SCL) SCL 5V VCC GND GND プログラム 色々書きましたが、LiquidCrystal_I2C.hを使う場合は細かいことは意識することなく表示することができます。(LiquidCrystal_I2C.hがいい感じにやってくれます) ...

2025/01/27 · Last updated on 2025/03/14 · 1 min · 126 words