MCP2515を使ってArduinoでCAN通信
MCP2515のモジュールを使ってArduinoでCAN通信をさせる。
ライブラリはMPC_CAN_libを使う。
スケッチの書き方は、MPC_CANのgithubのサンプルプログラムとヘッダを見るとわかりやすい。
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた - Yoshichiの日記
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた 2回目 - Yoshichiの日記
- OBD2(CAN)で自動車と通信(回路編) | Make.
- OBD2(CAN)で自動車と通信(スケッチ編) | Make.
- ArduinoでCAN-Busモニタ
- GitHub - coryjfowler/MCP_CAN_lib: MCP_CAN Library
・ハマったところ1
MCP_CAN::begin() が変更されてて、引数にいろいろ指定しなければいけなくなっていた。
何を指定しなければいけないかはサンプルプログラムとヘッダを見て判断した。
第1引数:IDの種類
第2引数:canの通信速度
第3引数:モジュールとの通信レート(今回の場合はモジュールの水晶発振子の周波数)
・ハマったところ2
MCP_CAN::setMode() が抜けてた
簡単なArduinoスケッチ
以下のソースではif(!digitalRead(INT_PIN))の部分でモジュールからの割り込みをポーリングしているが、
モジュールの割り込み用ピンをArduinoの外部割込み(ハードウェア割り込み)に割り当てて、
割り込み処理したほうが効率がいいと思う。
// ライブラリヘッダのインクルード #include <mcp_can.h> #include <SPI.h> //設定値 #define CS_PIN (10) // CSを10ピンとする(変更可能) #define INT_PIN (9) // INTを9ピンとする(変更可能) long unsigned int rxId; unsigned char len = 0; unsigned char rxBuf[8]; MCP_CAN CAN0(CS_PIN); void setup() { Serial.begin(115200); CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする pinMode(INT_PIN, INPUT); // 割り込みのためのピンを設定 CAN0.setMode(MCP_NORMAL); Serial.println("MCP2515 Library Receive Example..."); } byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; void loop(){ //受信 if(!digitalRead(INT_PIN)) { // 受信割り込みが発生したら、CANデータをReadする CAN0.readMsgBuf(&rxId, &len, rxBuf); Serial.print("ID: "); Serial.print(rxId, HEX); Serial.print(" Data: "); for(int i = 0; i<len; i++) { if(rxBuf[i] < 0x10) { Serial.print("0"); } Serial.print(rxBuf[i], HEX); Serial.print(" "); } Serial.println(); } //送信 byte sndStat = CAN0.sendMsgBuf(0x122, 0, 8, data); if (sndStat != CAN_OK) { Serial.println("Error Sending Message..."); } delay(100); // send data per 100ms } /********************************************************************************************************* END FILE *********************************************************************************************************/
MCP3208-CI/PとRaspberryPi3でAD変換
RaspberryPiにはアナログ入力ポートがありません。
なのでMCP3208-CI/Pというアナログ-デジタル変換ICを使ってアナログ値を読み取ります。
MCP3208-CI/PとRaspberryPiとの通信にはSPI通信を使用します。
RaspberryPiのセットアップは終わってるものとします。
流れ
- WiringPiのインストール
- 通信の有効化
- 配線
- SPIでIC通信してデータを読み取る
- はじめてのAD変換(RaspberryPi3で試すアナログ・デジタル変換)
- WebIOPiでIoT!(6)プログラミング応用編~アナログ入力編 | Device Plus - デバプラ
- Raspberry Pi 3でpythonを使いA/Dコンバーターでアナログ信号を検出する!
- Raspberry Pi アナログ入力 (I2C A/D コンバータ) - Qoosky
- アナログ値を測る(ADコンバータ使用)(WebIOPi利用)
- https://camo.qiitausercontent.com/814a8e1947e5b55f3abcb2304c2e8523321ef7a8/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f353730372f38313964396263332d313831332d333562332d626337312d3565306161383737636434662e6a706567
- Raspberry PiでADC「MCP3208」のspi接続 | TomoSoft
- Raspberry PiでADコンバータ(MCP3208)を使う – NaviPlus Engineers' Blog
Ubuntuで一つのNICに複数のIPアドレスを割り当てる
IPエイリアスっていうらしい。
- DHCP static 混在 - Google 検索
- 1つのNICに複数のIPアドレスをアサインする - かえでのWebログ
- 【LIVA】【Ubuntu server14.04】1つのNICに複数IPアドレス - かっこいいブログ名つけたい
- 1つのNICに複数のIPアドレスを割り当て -わけあって、1つのNICに2つの- Windows Vista・XP | 教えて!goo
- CentOS7で1つのNICでDHCPと固定IPのIPエイリアス両方を設定する方法 - 旅モバ
- ネットワークカードに複数のIPアドレスを割り当てる:Tech TIPS - @IT
- IPエイリアス dhcp ubuntu - Google 検索
- Windowsでインターフェースに複数のIPを割り当てるには
TCP通信と非同期通信
マルチコアならスレッド作ってもいいのかな?
シングルコアならselectかpoll?
割り込みとかコールバック関数とか使えないの?
C++ならboostのasio使うか?
pythonならasyncioかthreadingか?
threading
asyncore?
pythonのいろんな非同期処理
pythonのいろんな非同期通信方法
- C/C++でネットワークプログラミングをやってみよう(2) - WonderPlanet DEVELOPER BLOG
- Programming UNIX Sockets in C - Frequently Asked Questions: クライアントとサーバ(TCP/SOCK_STREAM)両方に関する質問
- http://www.geocities.co.jp/SiliconValley/6071/technic/index.html
- Linuxネットワークプログラミング(シングルプロセス、シングルスレッドで多重化) | ITインフラ技術の実験室
- 8-18 poll()を利用したデータ受信プログラム:Geekなぺーじ
- selectを使う:Geekなぺーじ
- シングルスレッドで非同期socket通信 - 日々量産
- TCPサーバーの非同期処理はけっきょくどの手法がいいのか? - Qiita
- https://www.s-cradle.com/developer/sophiaframework/sf_reference/sec.network.socket.html
- pythonでsocket通信を勉強しよう - Qiita
非同期
ソケット通信
- ソケットプログラミング HOWTO — Python 3.5.4 ドキュメント
- https://www.sbcr.jp/books/img/Linuxnet_01.pdf
- https://www.sbcr.jp/books/img/Linuxnet_02.pdf
- https://www.sbcr.jp/books/img/Linuxnet_03.pdf
- http://i1i2i3.eidos.ic.i.u-tokyo.ac.jp/slides/socket.pdf