• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

アンドロ沼のブログ一覧

2021年01月24日 イイね!

水温計の作り方(マイコンユニット編)



整備手帳にも書きましたが、やっぱりケースの加工やはんだ付けが必要で、しかもプログラミングまでとなると、ちょっと難易度が高いかと思うので、今回はケース加工なし、半田付けなしをコンセプトに水温計兼タコメータを作っていきます。

まずは、マイコン基板ですが、前回はOLED付きの基板使いましたが、今回はさらにケースも最初からついてきている、M5StickCPlusというマイコンユニットを使うことにしました。これだと、CANユニットという拡張ユニットによって、半田付けなしで、CAN通信できるようになるというメリットもあります。
下記のURLのお店が安いのですが、今は残念ながら在庫が切れているようです。代わりに、M5Stick Cでも同じように作れますが、LCDの違いによりソフトは私の作ったものから改造しないといけないので、自分で改造する自信のない人は、Plusの在庫が戻ってから、CANモジュールと一緒に買うのがおすすめです。(一緒に買うと、送料が無料になります。)

僕が作るときも、M5Stickでもよかったのだけれど、その時は逆にPlusしか在庫がなくて、Plusになってしまった次第です。


Posted at 2021/01/24 13:56:10 | コメント(0) | トラックバック(0) | クルマ
2021年01月09日 イイね!

水温計の作り方(ソフトの説明編4)

今回のOLED版で変更したところを主に説明していきます。
まずは、起動ロゴですが、このOLEDのドライバで、画像を表示するときは、「xbm」という形式で、ソースコードに取り込む必要があります。画像を直接変換できると簡単なのですが、適切なコンバータを見つけることができなかったので、最終的にはリンク先のようなxbmエディタのページで、ドットをぽちぽち打ちながら、データを作成しました。(なので、いまいちかっこよくない。)
起動ロゴのほかに、水温を表示のところもドット絵を作成して、組み込んでいます。
作成した水温計データは、HEX形式なので下記のように定義されています。

#define WT_Logo_width 24
#define WT_Logo_height 24
const unsigned char WT_logo [] = {
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x24,0x00,
0x32,0x42,0x4c,0xcc,0x42,0x33,0x00,0x24,0x00,0x00,0x18,0x00,
0x98,0xc3,0x19,0x60,0x3c,0x06,0x00,0x00,0x00,0x00,0x00,0x00};

この定義されたデータを、下部の「DisplayOut()」という関数にある、下の行でX座標0、Y座標3の位置から描いています。
display.drawXbm(0, 3, WT_Logo_width, WT_Logo_height, WT_logo);

ロゴの表示は、起動時のみ2秒間表示するようにしました。

あとは、画面表示のところ以外大きく変えていないのですが、CANの送受信に使っていたピンが、OLED接続用のI2C通信に使われているので、干渉を避けるために15番ピンと、14番ピンに変更されてますので、CANドライバへ渡すピン情報も下記のように変わっています。(注:当初12番と14番と書いてましたが、不具合対応のため、15番と14番に変更しました。

CAN_cfg.tx_pin_id = GPIO_NUM_15;
CAN_cfg.rx_pin_id = GPIO_NUM_14;
Posted at 2021/01/09 15:38:16 | コメント(0) | トラックバック(0) | 日記
2021年01月09日 イイね!

水温計の作り方(ソースコード編2 不具合解決しました)


下記にソースコードを示します。エディタにコピペして、適当な名前を付けて、拡張子を”ino"にして保存してください。その後、Arduino IDEで開けば、コンパイル通るはずです。なお、実際に設置した水温計のソースでは、起動ロゴと水温計マークを別ファイルにしてたのを、一つのソースに修正したので、100%動く保証はできないんですが、たぶん大丈夫かと。
次回は、コンパイルの仕方説明します。

↓この下からソースです。

!2/28追記!
ようやくワーニングの問題が解決しました。原因は、CANの送信ピンとして、12番ピンを使用していましたが、そちらの初期状態の設定がLow出力になっていたために、CANの出力ピンとして初期化されるまでの間に、CANバスにドミナントの波形を出力していたことが原因の様です。(まっとうなオシロがないので、自宅でドミナント波形を確認したわけではないですが、様々な試行錯誤の結果としてそう判断しました。)
結果として、CANの送信ピンを15番に変更することで、ワーニングを発生させず使用することが可能になりました。


#include // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy include: `#include "SSD1306.h"`
#include
#include

CAN_device_t CAN_cfg;
unsigned long prev_time;
byte loop_counter;
int last_rpm;
//unsigned byte test;

// Initialize the OLED display using Wire library
SSD1306Wire display(0x3c, 5, 4);

#define Freed_width 124
#define Freed_height 64

const unsigned char Image2 [] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0xfe,0x07,0xfe,0x03,0xc0,0xff,0x03,0xff,0x0f,0xfc,0x0f,
0x00,0x00,0x00,0xf0,0x00,0xff,0x07,0xff,0x07,0xe0,0xff,0x83,
0xff,0x0f,0xfe,0x1f,0x00,0x00,0x00,0xf0,0x00,0xff,0x03,0xff,
0x0f,0xe0,0xff,0x81,0xff,0x07,0x1e,0x1c,0x00,0x00,0x00,0xf0,
0x80,0xff,0x81,0x07,0x0e,0xf0,0x00,0xc0,0x03,0x00,0x0f,0x1c,
0x00,0x00,0x00,0xf0,0x80,0x07,0x80,0x07,0x06,0xf0,0x00,0xc0,
0x03,0x00,0x0f,0x1c,0x00,0x00,0x00,0xf0,0xc0,0x07,0xc0,0x03,
0x07,0x78,0x00,0xe0,0x01,0x80,0x07,0x1c,0x00,0x00,0x00,0xf0,
0xc0,0x03,0xc0,0x83,0x03,0x78,0x00,0xe0,0x01,0x80,0x07,0x1c,
0x00,0x00,0x00,0xf0,0xe0,0x03,0xe0,0x81,0x03,0xfc,0x3f,0xf0,
0xff,0xc0,0x03,0x1e,0x00,0x00,0x00,0xf0,0xe0,0x3f,0xe0,0xff,
0x01,0xfc,0x1f,0xf0,0x7f,0xc0,0x03,0x1e,0x00,0x00,0x00,0xf0,
0xf0,0x3f,0xf0,0xfd,0x00,0xfe,0x1f,0xf8,0x7f,0xe0,0x01,0x0f,
0x00,0x00,0x00,0xf0,0xf0,0x1f,0xf0,0x3c,0x00,0x1e,0x00,0x78,
0x00,0xe0,0x01,0x0f,0x00,0x00,0x00,0xf0,0xf8,0x00,0x78,0x78,
0x00,0x0f,0x00,0x3c,0x00,0xf0,0x80,0x07,0x00,0x00,0x00,0xf0,
0x78,0x00,0x78,0x78,0x00,0x0f,0x00,0x3c,0x00,0xf0,0x80,0x07,
0x00,0x00,0x00,0xf0,0x7c,0x00,0x3c,0xf0,0x80,0xff,0x0f,0xfe,
0x3f,0x78,0xc0,0x03,0x00,0x00,0x00,0xf0,0x3c,0x00,0x3c,0xf0,
0x80,0xff,0x0f,0xfe,0x3f,0xf8,0xff,0x01,0x00,0x00,0x00,0xf0,
0x3e,0x00,0x1e,0xe0,0xc1,0xff,0x07,0xff,0x1f,0xfc,0xff,0x00,
0x00,0x00,0x00,0xf0,0x1e,0x00,0x1e,0xe0,0xc1,0xff,0x07,0xff,
0x1f,0xfc,0x7f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0};

#define WT_Logo_width 24
#define WT_Logo_height 24
const unsigned char WT_logo [] = {
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,
0x00,0xf8,0x01,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x24,0x00,
0x32,0x42,0x4c,0xcc,0x42,0x33,0x00,0x24,0x00,0x00,0x18,0x00,
0x98,0xc3,0x19,0x60,0x3c,0x06,0x00,0x00,0x00,0x00,0x00,0x00};

void setup() {
int i;
display.init();
display.setContrast(255);

Serial.begin(115200);
Serial.println("iotsharing.com CAN demo");
CAN_cfg.speed=CAN_SPEED_500KBPS;
CAN_cfg.tx_pin_id = GPIO_NUM_15;
CAN_cfg.rx_pin_id = GPIO_NUM_14;
CAN_cfg.rx_queue = xQueueCreate(10,sizeof(CAN_frame_t));
//start CAN Module
ESP32Can.CANInit();
Serial.print("APB_CLK_FREQ");
Serial.println(APB_CLK_FREQ);
prev_time = millis();
display.flipScreenVertically();
display.setLogBuffer(5, 30);
display.clear();
display.drawXbm(18, 0, Freed_width, Freed_height, Image2);
display.drawLogBuffer(0, 0);
display.display();
delay(2000);
DisplayOut(0,0);
}

void loop() {
static int current_rpm;
static int current_temp;
CAN_frame_t rx_frame;
//receive next CAN frame from queue
if(xQueueReceive(CAN_cfg.rx_queue,&rx_frame, 3*portTICK_PERIOD_MS)==pdTRUE){
if ((rx_frame.MsgID & 0xFFFFFF00) == 0x18daf100) {
if ((rx_frame.data.u8[2])== 0x05) {
current_temp = (int)((rx_frame.data.u8[3]) - 40);
DisplayOut(current_temp,current_rpm);
}else if ((rx_frame.data.u8[2])== 0x0c) {
current_rpm=(int)(((int)rx_frame.data.u8[3])*256 + (int)rx_frame.data.u8[4])/4;
DisplayOut(current_temp,current_rpm);
}
}
}
if ((prev_time-millis())> 50) {
prev_time=millis();
if (loop_counter == ((loop_counter/4)*4)) { // if counter value is even
rx_frame.FIR.B.FF = CAN_frame_ext;
rx_frame.MsgID = 0x18db33f1 ;
rx_frame.FIR.B.DLC = 3;
rx_frame.data.u8[0] = 0x02;
rx_frame.data.u8[1] = 0x01;
rx_frame.data.u8[2] = 0x0C; // Request engine speed
ESP32Can.CANWriteFrame(&rx_frame);
} else if (loop_counter == 19) { // 1sec expired
rx_frame.FIR.B.FF = CAN_frame_ext;
rx_frame.MsgID = 0x18db33f1 ;
rx_frame.FIR.B.DLC = 3;
rx_frame.data.u8[0] = 0x02;
rx_frame.data.u8[1] = 0x01;
rx_frame.data.u8[2] = 0x05; // Request coolant temperature
ESP32Can.CANWriteFrame(&rx_frame);
}
if (loop_counter >= 19) {
loop_counter = 0;
} else {
loop_counter++;
}
}
}


void DisplayOut(int temp,int rpm) {
char Str[3];
display.setLogBuffer(5, 30);
display.clear();
display.drawXbm(0, 3, WT_Logo_width, WT_Logo_height, WT_logo);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
sprintf(Str, "%d", temp);
display.drawString(45, 1, Str);
display.setFont(ArialMT_Plain_10);
display.drawString(0, 28, "Engine rpm (x1000)");
display.drawString(0, 39, "0");
display.drawString(18, 39, "1");
display.drawString(38, 39, "2");
display.drawString(58, 39, "3");
display.drawString(78, 39, "4");
display.drawString(98, 39, "5");
display.drawString(118, 39, "6");
display.setPixel(10,49);
display.setPixel(30,49);
display.setPixel(50,49);
display.setPixel(70,49);
display.setPixel(90,49);
display.setPixel(110,49);
display.fillRect(0,50,rpm/50,14);
// Draw it to the internal screen buffer
display.drawLogBuffer(0, 0);
// Display it on the screen
display.display();
}
Posted at 2021/01/09 15:18:03 | コメント(0) | トラックバック(0) | 日記
2021年01月09日 イイね!

水温計の作り方(OLEDドライバ導入編)

回路編に追記しましたが、ようやくワーニングの問題が解決したので、ソフトの作成方法の説明に入ります。
前回と異なり、OLED表示するために。OLEDのドライバを追加する必要があります。そのため、リンク先のページの「4.OLEDに表示する」のところにライブラリの追加の仕方の説明があるので、そちらの指示通りにドライバをダウンロードして、組み込んでください。
組み込みが成功したら、下図のようにサンプルコードを読み込み、リンク先のページでも説明されているように、「SSD1306 display(0x3c, 5, 4);」接続ピンの設定を5,4に書き換えて、コンパイルし、時計が表示されることを確認してください。

あと、リンク先にもあるように、ボードの設定を「WEMOS Lolin 32」に変更することも忘れないようにしてください。
Posted at 2021/01/09 14:46:28 | コメント(0) | トラックバック(0) | 日記
2020年12月31日 イイね!

追記! 水温計の作り方(回路編2 アップデート済)

今度の回路は、ディスプレイを繋がなくていいので、さらに簡単です。載せる必要もないかと思いますが、参考図を下記に。ただ、OLED付きESP32基板のイメージデータが手に入らなかったため、OLEDなし基板でごまかしてます。重要なことは、CANのTXが15番ピン、RXが14番ピンになるというところが前回からの変化点です。というのも、前回CAN Tr基板に繋いでいた4,5番ピンが内部的にOLEDと接続されてしまっているので、CANに使えないため、こちらに移動する必要があったのです。(不具合対応のため、Txを15番にさらに変更しました。)
配線図を上げようと思ったのですが、基板のモデルがないので、実際の配線を示します。

まあ、それ以外は前回のままです。注意点としてはケースに配線を撮り回す余裕が全くないので、下の写真にあるように高さ的にCANTr基板を付けられる場所がここしかないので、そこに引っ付ける前提で、線が余らないようにギリギリを狙って、かつ、はんだ付け部がケースと干渉しないように、加工を行う面をケースと反対側につけるというアクロバティックな技を駆使しないと、後で入らなくて泣くことになります。
写真を参考に、細心の注意を払って接続してください。


!!重要!!
すいません。一度アップした後、CAN Tr基板のターミネータ抵抗の値が不適切であることが判明した。なので、組み込む前に下図の赤丸部分のチップ抵抗を事前に外しておく必要があります。

(前回、このターミネータ抵抗がワーニングの原因と書いてましたが、それは誤りです。ただ、ついてる抵抗値が適切でないのも事実なので、外した方がいいです。)
Posted at 2020/12/31 20:27:32 | コメント(0) | トラックバック(0) | クルマ

プロフィール

「水温計の作り方(M5StickC plus ソースコード編2) http://cvw.jp/b/1552949/45254112/
何シテル?   07/05 22:01
アンドロ沼です。アクアからフリードハイブリッドに買い換えしました。
みんカラ新規会員登録

ユーザー内検索

<< 2025/9 >>

 123456
78910111213
14151617181920
21222324252627
282930    

愛車一覧

ホンダ フリードハイブリッド ホンダ フリードハイブリッド
家族が増え、強い圧力がかかり買い換えました。
スズキ ワゴンRハイブリッド スズキ ワゴンRハイブリッド
電車通勤から、車通勤に替り買い足しました。
トヨタ アクア トヨタ アクア
Fitからアクアに買い替えついでに、いろいろいじろうと思ってます。

過去のブログ

2021年
01月02月03月04月05月06月
07月08月09月10月11月12月
2020年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation