あとをしNOTE

Welcome to my blog🎉

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/28 · 8 min · 1582 words

HUGOブログをiPhoneで書く環境

執筆は基本PCで行いますが、iPhoneなどのモバイルでも行います。 これまでは、一度PCから投稿した記事をgithubのアプリからrawデータを編集して更新していましたが使い易くは無かったです。 普段のライフログにはobsidianを使っており、workingcopyでgithubと連携していますが、同じように使ってみたところと結構良いです。 HugoフォルダをiPhoneのローカルにgit cloneします。 .obsidianは.gitignoreにしましたが、hugoには影響ないようです。 obsidianではfrontmatterをきれいに表示してくれるのが便利です。 デメリット hugo new posts/A/index.mdができないので新規記事はフォルダを作ったりindex.mdをコピペしたりと手間がかかる。 iPhoneからはhugo server -Dができないので、プレビューが見れません。しかしobsidianでプレビューできますので問題になってません。

2025/02/08 · Last updated on 2025/03/10 · 1 min · 14 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

ch32v003fun CH32V003F4P6 シリアル通信

はじめに シリアル通信を試しました 注意点 SWIOだけではシリアル通信できません。 WCH-LinkEのRXとCH32V003F4P6のUTX(pin2,PD5)を接続する必要があります。 接続 3.3V GND SWIO(PD1) TX(PD5)の4本です。 プログラム サンプルがほぼそのままで動作しました。楽〜 C:\Users\USERNAME\Downloads\ch32v003fun\examples\uart_tx_dma\uart_tx_dma.c ch32v003funをWindowsに構築しCH32V003F4P6でLチカ | atooshi-noteでch32v003funをダウンロードした場所と同じです。 接続してポートを認識しており(COM7でした)、teratermで通信を確認しました。 /* * This example uses DMA for the UART to transfer the "Hello World!\r\n" string * once per second. Connect a UART Rx pin to D5, flash the example, setup your * uart for 115200n1 and the messages should appear シリアル通信のチェック */ #include "ch32v003fun.h" // Set UART baud rate here #define UART_BR 115200 // LED on D6 (nanoCH32V003 board) // #define LED_PIN 6 #define LED_PIN 4 // ch32v003f4p6のdevelopmetboard // DMA transfer completion interrupt. It will fire when the DMA transfer is // complete. We use it just to blink the LED __attribute__((interrupt)) __attribute__((section(".srodata"))) void DMA1_Channel4_IRQHandler(void) { // Clear flag DMA1->INTFCR |= DMA_CTCIF4; // Blink LED GPIOD->OUTDR ^= 1<<LED_PIN; } static void led_setup(void) { RCC->APB2PCENR = RCC_APB2Periph_GPIOD; GPIOD->CFGLR = ((GPIO_CNF_IN_PUPD)<<(4*1)) | // Keep SWIO enabled. (GPIO_Speed_2MHz | GPIO_CNF_OUT_PP)<<(4*LED_PIN); // LED ON GPIOD->BSHR = 1<<LED_PIN; } static void uart_setup(void) { // Enable UART and GPIOD RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1; // Push-Pull, 10MHz Output on D5, with AutoFunction GPIOD->CFGLR = (GPIOD->CFGLR & ~(0xF<<(4*5))) | ((GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*5)); // Setup UART for Tx 8n1 USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx; USART1->CTLR2 = USART_StopBits_1; // Enable Tx DMA event USART1->CTLR3 = USART_DMAReq_Tx; // Set baud rate and enable UART USART1->BRR = ((FUNCONF_SYSTEM_CORE_CLOCK) + (UART_BR)/2) / (UART_BR); USART1->CTLR1 |= CTLR1_UE_Set; } static void dma_uart_setup(void) { // Enable DMA peripheral RCC->AHBPCENR = RCC_AHBPeriph_SRAM | RCC_AHBPeriph_DMA1; // Disable channel just in case there is a transfer in progress DMA1_Channel4->CFGR &= ~DMA_CFGR1_EN; // USART1 TX uses DMA channel 4 DMA1_Channel4->PADDR = (uint32_t)&USART1->DATAR; // MEM2MEM: 0 (memory to peripheral) // PL: 0 (low priority since UART is a relatively slow peripheral) // MSIZE/PSIZE: 0 (8-bit) // MINC: 1 (increase memory address) // CIRC: 0 (one shot) // DIR: 1 (read from memory) // TEIE: 0 (no tx error interrupt) // HTIE: 0 (no half tx interrupt) // TCIE: 1 (transmission complete interrupt enable) // EN: 0 (do not enable DMA yet) DMA1_Channel4->CFGR = DMA_CFGR1_MINC | DMA_CFGR1_DIR | DMA_CFGR1_TCIE; // Enable channel 4 interrupts NVIC_EnableIRQ(DMA1_Channel4_IRQn); } static void dma_uart_tx(const void *data, uint32_t len) { // Disable DMA channel (just in case a transfer is pending) DMA1_Channel4->CFGR &= ~DMA_CFGR1_EN; // Set transfer length and source address DMA1_Channel4->CNTR = len; DMA1_Channel4->MADDR = (uint32_t)data; // Enable DMA channel to start the transfer DMA1_Channel4->CFGR |= DMA_CFGR1_EN; } int main(void) { static const char message[] = "Hello World!!!\r\n"; SystemInit(); led_setup(); uart_setup(); dma_uart_setup(); while (1) { dma_uart_tx(message, sizeof(message) - 1); Delay_Ms(1000); } } 参考 CH32V003をArduinoで使う: DJ HIGO オフィシャルブログ ...

2025/01/16 · Last updated on 2025/03/14 · 2 min · 421 words

ソリオMA15S ELM327 複数PID同時問い合わせ

はじめに ELM327は複数PIDを同時に扱うことができ、時短になります。 車両が対応していれば、最大6byte(6個)のpidを同時に問い合わせ可能です。 ソリオは対応してる様です。 返答データが6byte以上だと、ELM327 データシートのMultiline Responses (p44/82)に記載があるように複数行で返ってきます。 使用したもの ELM327 v1.5 結果 PIDを一つずつ増やしていき、挙動を確認しました。 PID 1byte(1種類)(通常) > 0105 41 05 7A 送信 : 0x05 (Engine coolant temperature) 回答 : 0x7A 0x7A = 0d122 値 : 122 - 40 = 82℃ PID 2byte(2種類) > 01050c 41 05 7A 0C 0A 16 順番は service(01) PID1(05) PID1のdata(7A) PID2(0C) PID2のdata1(0A) PID2のdata2(16) PID1 : 0x05 PID2 送信 : 0x0c (Engine speed) 回答 : 0x0A16 0x0A = 0d10 0x16 = 0d22 値 : (256 * 10 + 22) / 4 = 645rpm PID 3byte(3種類) ...

2025/01/12 · Last updated on 2025/03/14 · 2 min · 332 words

ch32v003funをWindowsに構築しCH32V003F4P6でLチカ

はじめに ch32v003funの環境をWindowsに構築したメモです。 Installation · cnlohr/ch32fun Wikiの通りにやれば良いのですが、自分のまとめをしました。 環境 Windows10 CH32V003F4P6 Development board 詳細はアリエクで買ったCH32V003F4P6 Development board | atooshi-noteに記載 WCH-LinkE version 2.15 構築 githubからch32v003funを好きなフォルダにダウンロードします。 cnlohr/ch32fun: Open source minimal stack for the ch32 line of WCH processors, including the ch32v003, a 10¢ 48 MHz RISC-V Microcontroller - as well as many other chips within the ch32v/x line. 私は、C:\Users\USERNAME\Downloads\ch32v003funにgit cloneしました。 gccインストール Prebuilt GNU toolchain for RISC-Vから、risc-v-gcc10.1.0.exe (22 MB) をダウンロード、イントールします。 インストール先:C:\SysGCC The minichlink.exe file is already ready to go in the minichlink folder. ...

2025/01/06 · Last updated on 2025/03/14 · 3 min · 445 words

アリエクで買ったCH32V003F4P6 Development board

はじめに アリエクで買ったCH32V003F4P6 Development boardのメモです。 適当に買ってあったのですが、使う時に回路図がわからず調べました。 WCH-LinkEとDevelopment boardのセットで1000円ほどで買いました。以下です。 https://ja.aliexpress.com/item/1005005834050641.html Development board単体なら300円くらいです。 商品ページには回路図が載っていないのですが、一番下にドキュメントの記載がありました。 ドキュメント start [ICBbuy] 回路図 回路図は以下です。 developmentboard:ch32v003 [ICBbuy] LEDが2つ載ってますが、一つは電源投入で点灯するLED(PWR)です。 もう一つはLチカ確認用(D1)なのですが、PD4に接続されています。 以上:)

2025/01/06 · Last updated on 2025/03/14 · 1 min · 21 words

ソリオMA15Sが対応しているPIDを調べる

はじめに OBDから取れるデータは何か、対応しているPIDを調べてみました。 Wikiに載ってるStandard PIDsは全て対応しているわけでは無いため、ソリオが対応しているPIDを調べてみます。 使ったもの ELM327 v1.5 調べ方 Service 01 PID 00 - Show PIDs supported 上記wikiにあるように、ELM327からコマンド01 00(service 01 PID 00)を送信するとPID 01からPID 20までで、対応しているPIDのビットには1、未対応のPIDのビットには0がセットされます。 wikiの例だと、01 00の応答が0x BE 1F A8 13だった場合、これを2進数に変換すると 0b 1011 1110 0001 1111 1010 1000 0001 0011 となるため 対応してるPIDは1が立っているPID 01, 03, 04, 05, 06, 07, 0C, 0D, 0E, 0F, 10, 11, 13, 15, 1C, 1F ,20となります。 左端から見ていくため、例えば左端の0xB=0b1011では、PID 01は対応、02は未対応、03,04は対応ということになります。 PID 20が対応しているということは次の PIDs supported [$21 - $40] ということになるため、PID 21 から PID 40 が存在するということになります。 コマンド01 00と同様に考えて、01 20を送信するとPID 21 から PID 40 までの対応状況が分かります。 ...

2025/01/05 · Last updated on 2025/02/19 · 3 min · 473 words

ArduinoでOBDをシミュレートしてELM327とつなぐ

はじめに 車両のOBDでデータを取りたいと思っていますが、車両で開発は大変なのでArduinoで車両をシミュレートする環境を作りました。 参考 以下を参考にさせていただきました。ありがとうございます。 環境 windows Arduino nano互換機 MCP_CAN_lib v1.5.1 ELM327 v2.1 MCP2515モジュール Car Scanner(Androidアプリ) OBDケーブル Arduino nano互換機 について 久々に使ったので、最初書き込みができなくて困りました。 IDEでOld Bootloaderを選択します。 MCP2515モジュール について Amazonで3個セット安いやつです。 KKHMF 3個 MCP2515 CAN バス モジュール TJA1050 SPI レシーバー Arduino AVR MCU ARM に対応 不良が混じっていることが多いみたいなのでモジュールを2つ使って動作確認をしました。 こちらは以下を参考にして動作確認をしました。ありがとうございます。 OBDケーブル について 以下を使用しました。 LoongGate OBD - II 16ピンオープンプラグワイヤを終了するには - OBD2 16ピンラウンド延長コネクタ診断ケーブル - 0.3メートル レビューには商品袋に記載のピンアサインと実際のピンアサインは違うとあったのでテスターチェックしましたが、商品袋に記載の通りでした。なのでGreen - CAN-H,Green/White - CAN-Lで接続しています。 Pin Color Function 4 Orange Chassis GND 5 Light blue Signal GND 6 Green CAN high 14 Green/white CAN low 16 Red 12V ...

2024/12/26 · Last updated on 2025/02/07 · 1 min · 150 words