投稿

ラベル(ESP32)が付いた投稿を表示しています

ESP32でCAN通信(RTR frameとextended format設定)

イメージ
 RTR frameとextended formatはデフォルトで有効となっています。 CAN送信のスケッチを書く時は気をつけましょう。 "twai_types.h"で指定されているようです。 必要に応じて、CAN IDを指定する"message.identifier =・・・"の前辺りに、 次のコードを書いて設定しましょう。 message.extd = 0;//0:Standard(11bit ID) 無指定:extended format(29bit ID) message.rtr = 0;//0:Data frame 無指定:RTR frame                 忘れてた CAN ID"0xF6"で送っているつもりが、受信側"80000F6"と表示され、 しばらく悩んだので備忘記投稿しました。  

Arduino UNO MINIMAでCAN通信(接点伝送してみる MCP23017出力)

イメージ
 CAN通信の活用方法を考えています。 今回テーマも「接点伝送」です。 CANバスを経由で機器を制御するようなことができると思います。 備忘記なんですが、参考に紹介します。 前回「接点伝送」の出力IOエキスパンダを I2CインターフェースのMCP23017に変更しています。                 スケッチ変更したところだけ // Pins used to connect to CAN bus transceiver: #define RX_PIN 17 //接続ピンをGPIO21から17へ変更 #define TX_PIN 16 //接続ピンをGPIO22から16へ変更 //中略   // uncomment appropriate mcp.begin   if (!mcp.begin_I2C()) { //アンコメントする   //if (!mcp.begin_SPI(CS_PIN)) { //こちらをコメントアウトする     Serial.println("SPI Error.");     while (1);   } //省略 スケッチは少しの変更だけで使えます。  

Arduino UNO MINIMAでCAN通信(接点伝送してみる)

イメージ
 CAN通信の活用方法を考えています。 今回テーマは「接点伝送」です。 CANバスを経由で機器を制御するようなことができると思います。 備忘記なんですが、参考に紹介します。 (更に書き足しました) 送信側(入力側)オリジナルスケッチ"CANWrite.ino"の最後の方に "delay(1000)"(1秒)入っています。 これは、1秒間止まって待っているということですから、もったいないと思います。 かといって、入力が変わらないのに高速に送り続けるのもどうかと思います。 変化したときだけ送るとか、実際に機器に使うときは考えましょう。 (少し書き足しました。) 入出力デバイスはIOエキスパンダを使ってみました。 入力はI2CインターフェースのMCP23017、 出力はSPIインターフェースのMCP23S17です。 なんでインターフェースが違うデバイスを使ったの? ピンリストでI2Cの端子と思われるGPIO21ーWIRE_SCL, GPIO22ーWIRE_SDAが、CAN_TX、CAN_RXが割り当てられていたので、 I2Cは使えないと思い込んで、SPIインターフェースを選択した経緯あり。 ESP32の"IO MUXとGPIOマトリックス"機能があって、GPIOピンに割り当てる 機能を変えられる(合ってる?)、ピンリストに表示されているのは、 デフォルトで接続されるGPIOピンかな? CANトランシーバの接続を、GPIO16,17に変えても動くようなので、 GPIO21ーWIRE_SCL,GPIO22ーWIRE_SDAにI2Cインターフェースの MCP23017を接続してもよいのではないかと思います。 SCL、SDAのGPIOピンを変えることもできると思うが、 CAN_TX、CAN_RXを変えるほうが簡単。 準備 ESP32とArduino UNO R4ボードマネージャ、 "Adafruit MCP23017 Arduino library"をインストールしておく。 動作確認のときはPCが2台あると便利です。 ・CAN受信側(出力)MCP23S17を使用した接続 出力側スケッチ サンプルスケッチTWAIreceive.inoへMCP23x17用を組み合わせただけです。 追加する部分だけ 実際の...

Arduino UNO MINIMAでCAN通信(4byteデータを2つ送るには)

イメージ
 CAN通信の活用方法を考えています。 今回テーマは「4byteデータを2つ送るには」です。 2byteを4つ送るとか応用もできます。 備忘記なんですが、参考に紹介します。 Arduino UNO R4 MINIMA CANWrite.inoサンプルスケッチの改変部分 static uint32_t value1 = 0;//millis()を入れてみます static uint32_t value2 = 0;//サンプルスケッチのmsg_cntを入れてみます //中略 value1 = millis(); // uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};//オリジナル   uint8_t const msg_data[] = {0,0,0,0,0,0,0,0};   memcpy((void *)(msg_data), &value1, sizeof(value1));   memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));//オリジナルそのまま使う   CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data); //中略 ESP32 TWAIreceive.inoスケッチの改変部分ほか //中略     //4byteデータ、2個の数値が送られてくる     uint32_t value1 = 0;     uint32_t value2 = 0;     while (twai_receive(&message, 0) == ESP_OK) {         Serial.printf("\nID: %lx\n", message.identifier);//改行してID:xx 表示して改行         //"\n"は改行 書式指定文字 %lx 倍精度整数?を16進で出力する       ...

Arduino UNO MINIMAでCAN通信(ESP32 TWAIreceive.ino受信時変更点)

イメージ
 以前の投稿で解決策を追記しましたが、わかりにくくなっていたので新たに投稿しておきます。 変更点書き忘れもありました。 笑って許してくれる方だけ見てくださいね・・・                 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(TWAIreceive.ino)+CANトランシーバ:SN65HVD230 発生する問題点 ・MINIMA側(送信)シリアルモニタにエラー表示 CAN.write(...) failed with error code -60003 ・ESP32側(受信)シリアルモニタに高速出力 ・変化データを送信しても、受信(ESP32)データが更新されない。 ESP32 TWAIreceive.inoの変更するところ  setup関数の中 "TWAI_MODE_LISTN_ONLY"を"TWAI_MODE_NORMAL"へ変更 TWAI_TIMING_CONFIG_500KBITS()をTWAI_TIMING_CONFIG_250KBITS()へ変更 //TWAIreceive.ino //setup関数の中にある //Initialize configuration structures using macro initializers //twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_LISTEN_ONLY);//変更前 //twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();//変更前 twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);//変更後 twai_timing_config_t t_config = ...

解決Arduino UNO MINIMAでCAN通信(MINIMA >> ESP32twaireceiveで受信できたが)

イメージ
少し前に進みました? 笑って許してくれる方だけ見てくださいね! 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(TWAIreceive.ino)+CANトランシーバ:SN65HVD230 これでやっています。 最終的に送信側をXIAO RA4M1にしたいと目論んでいます。 困りごと・・・☆解決☆(2025/02/03) ・1秒毎の送信なのに、受信側はシリアルモニタに高速出力?☆解決☆ ・変化データ送信で、受信データが更新されない。☆解決☆ 変更点 TWAIreceive.ino setup関数の中 "TWAI_MODE_LISTN_ONLY"を"TWAI_MODE_NORMAL"へ変更   //TWAIreceive.ino //setup関数の中にある   //Initialize configuration structures using macro initializers //twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_LISTEN_ONLY);//変更前   twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);//変更後 新たに確認できたこと(2025/01/21) ESP32同士なら問題なさそう?な雰囲気、まだ変化データは未確認だった。 つまり"マイコンの組み合わせ"? でもXIAO RA4M1を使いたいので、打開策調べます。 ESP32同士の受信シリアルモニタ表示 1sec毎表示されます。 (送信側をUNO R4からESP32に変えたということです。) (TWAIreceive.ino-->TWAItransmit.ino) なんで"Extended Format"になってるんだろう?           ...

Arduino UNO MINIMAでCAN通信(ESP32 > twaireceive.inoで受信できたが)

イメージ
この投稿には、役立つ情報はなにも載っていません。 ESP32側には"available( )"みたいなやつが見つからないんです。 何か方法がないか調べています。 ESP32側 別のライブラリという方法もありそうですが、 こちらも少々問題があり、TWAI(CAN類似)を使うことにしたのですが うまくいかないのでした。 構成は 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(twaireceive.ino)+CANトランシーバ:SN65HVD230 通信ができただけ、まだ進んでいません。                  受信側(ESP32)のシリアルモニタ出力 延々と出力されます。                つづくと思います。

Arduino UNO MINIMAでCAN通信(写真と・・・)

イメージ
 この投稿は、写真を見ていただくだけで、役立つ情報は載っていません。 接続しただけで、まだなにも進んでいません。                 ESP32が側がまだわからんのです。 調べます。 つづく

CAN通信開発中RaspberryPiではセルフパワーUSBハブで安定

イメージ
 RaspberryPi 4Bを使ってArduinoIDE動かしています。 ESP32の起動失敗やSDのファイルオープン失敗など不安定な現象が発生していました。 USB延長ケーブルとブレットボード接触甘めで電源電圧低下していたようです。 ブレットボード用ジャンパーワイヤをやめてブレッドボードにピンヘッダを挿してはんだ付け さらにセルフパワーのUSBハブを導入しました。 不安定な挙動は全くなくなりました。

CANバスモジュールを使ってデータ送受信する。(ATmega Arduino)

イメージ
 数台の機器からデータを送って、受信したデータをまとめて保存するようなものを作るため、 スケッチを書いてテストしています。 SPI接続CANバスモジュール(コントローラ:MCP2515、トランシーバ:TJA1050)と Arduino-UNO 2台、AE-ESP32 1台 analogRead値やmillis()をそのまま送ってESP32で受信しています。 ESP32受信で問題発生 約5秒毎に正常データと異常データ(全部0XFF)が受信される問題発生します。 chatGPT先生に色々聞いてみましたが解決に至らず、 送信と受信のマイコンを入れ替えてみると現象が発生しなくなりました。 最終的にはAE-RP2040を使う予定なので交換してテストします。 複数のデータそれぞれにID番号を割り当てて 送信側:数値をばらしてバイト配列に入れて送る。 受信側:バイト配列を組み立ててもとの数値へ戻す。 準備できたら送信、受信スケッチを紹介したいと思います。

ESP32pcntカウンタをテストしてみた

  ESP32pcntカウンタをテストしてみた 2021/12/9 No.262 マイコンソフトウェア ESP32でpcntカウンタでパルスをただ数えるだけ。 16bitの符号付きの高速なパルスカウンタです。 もっと詳しい事を知りたい方は esp32 pcntで検索するとなにか見つかると思います。 桁数が足らないので工夫しています。 素人の書いたコードなので間違いがあるかも知れません。 #include "driver/pcnt.h" #define PULSE_INPUT_PIN 32 //パルスの入力ピン #define PULSE_CTRL_PIN 33 //制御ピン #define PCNT_H_LIM_VAL 32768 //カウンタの上限32768 16bit Counter 65536 #define PCNT_L_LIM_VAL -32768 //カウンタの下限-32768 int16_t count = 0; //カウント数 unsigned long currentCount = 0; unsigned long previousCount = 0; unsigned long addCount = 0; unsigned long previousMillis = 0; const long interval = 1000; void setup() { pcnt_config_t pcnt_config;//設定用の構造体の宣言 pcnt_config.pulse_gpio_num = PULSE_INPUT_PIN; //pcnt_config.ctrl_gpio_num = PULSE_CTRL_PIN;//制御信号入力GPIO番号 pcnt_config.ctrl_gpio_num = PCNT_PIN_NOT_USED; pcnt_config.lctrl_mode = PCNT_MODE_REVERSE;//_REVERSE:invert counter mode(increase -> decrease, decrease -> increase) pcnt_config.hctrl_mode = PCNT_MODE_KEEP;//_KEEP:won’t change counter mode //...