2021年2月27日土曜日

esp32+mcp2562 CAN送受信機...その1

ハード的な準備

esp32とCANトランシーバーが必要です。トランシーバーは、3.3V駆動、5V駆動等数種類あります。今回使ったのは、5V駆動のMCP2562です。配線等は、こちらのページを参考にしました。

MCP2562を使った電子工作- 人気IoTマイコン【ESP32】 | Tommy blog

データーシートはこちらです。

ピン番号勘違いするといけないので、kicadを使って回路図にしました。

基板を作るわけではないので回路図だけです。しばらく使わないうちに5.15から5.1.9にバージョンアップしてました。esp32はシルクプリントがあるのでそこに配線します。ただし、シルクプリントの文字は小さいです。

ブレッドボードに差し込んで配線しました。こんな感じです。

送信を緑線、受信を白線にしました。左上がCAN_HとCAN_Lの配線となります。

ソフトウェア

VScodeを使って、arduinoをプラットフォームとして環境を構築します。

esspressifから提供のCANサンプルを活用します。GPIOは、送信がGPIO5、受信がGPIO4です。arduinoのソースは、以下のとおりです。

ソース 

(GISTは、埋め込み出来なくなりました)

バイナリーの作成と書き込み

VScode+PlatformIOでバイナリーを作成します。特にエラーもなく問題なくバイナリーは作成できました。書き込みも問題なしです。

リセットしてシリアルモニターすると、プログラムは動いている感じです。

今後の予定

CAN送受信機は出来たのですが、問題ないのか機能確認をするすべがありません。いきなり、車やバイクに接続するのも怖いので何らかの手法を考えたいと思います。オシロがあればいいのですが、テスターしか手元にはありません。中華製探すと3-5万円程度でそれなりのが出ております。買うかどうかはちょっと考えます。

今日のまとめ

マイコンesp32とCANトランシーバーmcp2562を使って、CAN送受信機を作りました。ソフトウェアは動いている感じですが、CANデーターの送受信を確認する手段がありません。考えながら少しずつ進めたいと思います。

ラズパイ日記から移行します

大変申し訳ありません

これまでたくさんのコメントやリンクを張っていただいた方、大変申し訳ありません。

テンプレートをいじったら、元に戻らなくなりました。新たなページとしてドメインを変更しました。引き続きよろしくお願いします。

【旧】ラズパイ日記 http://labo-kajisaki.blogspot.jp こちら

【新】組込み一歩のはまりから  http://h-kaji.blogspot.jp こちら


2021年2月20日土曜日

pi pico...まずはLチカ

 

Pi picoを早速購入しました。まずは、基本のLチカから。Lチカだけでは終わらず、勢い余ってI2C接続OLEDの表示まで確認できました。

準備

Pi picoは、基板だけで足が付いていません。試験等をするのはブレッドボードなのでピンヘッダーをつけないといけません。片側20ピンです。ブレッドボードに差してから半田付けすると動かなくて作業しやすいです。

長い足を付けておくと、上からメスコネクタの配線が出来るので便利になるかもしれません。

足を半田付けして、ブレッドボードに差しておけば準備完了です。

ソフトウェア

オンボードLEDを点滅させるバイナリーが公開されています。ここから、取ってきて読み込ませればいいです。読み込ませるのは、専用シリアルプログラムは必要なく、USBケーブルで接続するとストレージに見えるbootプログラムが書き込まれており、そこへバイナリーをコピーすれば自動的にリセットがかかって、実行してくれます。

開発環境

専用開発環境のSDKがまとまっています。無理やりVScodeでも開発できますが、拡張機能のplatformIOにはまだpi picoは準備できていません。間もなくarduinoでも開発できるようです。

今回は、こちらを参考にwin10上のWSL2で起動可能なdebian上にSDKを展開したいと思います。

Raspberry Pi Pico を WSL からあつかう - Qiita

cmakeは、新しいのものに入れ替えないといけないようです。

Download | CMake

CMakeのインストール方法 - jskangarooのブログ

このCmakeってのが、最近はやりなのかちょっと前からなのよく見ます。今一つ使い方と設定の書き方がよくわかりませんが、srcとバイナリを違うディレクトリで管理できるのでスッキリはします。

すべてのサンプルコードは、u2fファイルになりましたので、試したいu2fファイルをPi picoに放り込んでいけばリセットかかって動きます。

オンボードLEDのblinkやGPIOに接続したLEDとの交互点滅や、オンボードLEDのPWM制御も簡単に切り替えることができます。

 

micropythonはどうよ

お手軽お試しには、C/C++よりはハードル低いはずです。こちらから、micropythonのu2fファイルを取ってきて、放り込めばPi picoに自動的にリセットがかかってmicropythonは動きます。

お好きなシリアル端末でUSB経由のCOMポートをたたけばmicropythonのコマンドプロンプトが表示されます。

Ctrl-Dでソフトリセットがかかります。

>>>
MPY: soft reboot
MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>

VScodeではpico-GOという拡張機能があり、同様にシリアル接続が可能です。VScodeで書いたものを、Pi picoへ送信してくれるので標準IDEのような感じになります。

お試しで、I2C接続したOLEDに文字を書いてみましょう。

試行錯誤した結果、以下の3つのファイルを作成しました。

boot.py
main.py
ssd1306.py

pico-GOからuploadすると、最初はエラーが出ますが、何度かやってると書き込まれるようです。

Ctrl-DにてSW restすると自動的に起動するようになります。

>>>
MPY: soft reboot
boot start..
I2C Address      : 0X3C
I2C Configuration: I2C(0, freq=200000, scl=5, sda=4)

無事OLEDにも表示されました。それぞれのファイルの内容は、ページ最下部に貼っておきます。なんかまだ違っているような気もします。OLEDは、ちゃんと表示できてます。


今日のまとめ

pi picoのC/C++開発環境をWin10のWSL2(debian)に構築して、サンプルバイナリーを作成し実行できることを確認しました。micropythonは、VScode+pico-GO拡張機能を使って、OLEDの表示を確認しました。C/C++は、ちょっと独自な記述が必要な感じです。arduinoも対応できるようになれば過去の成果が活用できます。micropythonは、母艦環境の構築がすべてですね。標準IDEがいいのでしょうけど、マイコンごとに使い方が異なるのがよくないです。

参考サンプルコード等

とりあえず、ベタっと張っておきます。Githubの使い方もそのうちマスターします。

boot.py

  print("boot start..")
  import main
  import ssd1306

boot.py

# Display Image & text on I2C driven ssd1306 OLED display 
from machine import Pin, I2C
from micropython import const
from ssd1306 import SSD1306_I2C
import framebuf
import utime

WIDTH  = 128                                            # oled display width
HEIGHT = 64                                            # oled display height

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000)       # Init I2C using pins GP8 & GP9 (default I2C0 pins)
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c))                   # Display I2C config

oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                  # Init oled display

# Raspberry Pi logo as 32x32 bytearray
buffer = bytearray(b"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|?\\x00\\x01\\x86@\\x80\\x01\\x01\\x80\\x80\\x01\\x11\\x88\\x80\\x01\\x05\\xa0\\x80\\x00\\x83\\xc1\\x00\\x00C\\xe3\\x00\\x00~\\xfc\\x00\\x00L'\\x00\\x00\\x9c\\x11\\x00\\x00\\xbf\\xfd\\x00\\x00\\xe1\\x87\\x00\\x01\\xc1\\x83\\x80\\x02A\\x82@\\x02A\\x82@\\x02\\xc1\\xc2@\\x02\\xf6>\\xc0\\x01\\xfc=\\x80\\x01\\x18\\x18\\x80\\x01\\x88\\x10\\x80\\x00\\x8c!\\x00\\x00\\x87\\xf1\\x00\\x00\\x7f\\xf6\\x00\\x008\\x1c\\x00\\x00\\x0c \\x00\\x00\\x03\\xc0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00")

# Load the raspberry pi logo into the framebuffer (the image is 32x32)
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB)

while True:
    # Clear the oled display in case it has junk on it.
    oled.fill(0)

    # Blit the image from the framebuffer to the oled display
    oled.blit(fb, 96, 0)

    # Add some text
    oled.text("PI pico",5,8)
    oled.text("SSD1306 test",10,30)
    oled.text("Kaji tech",28,50)

    # Finally update the oled display so the image & text is displayed
    oled.show()
    utime.sleep(1)
    oled.fill(0)
    utime.sleep(5)

ssd1306.py

micropython/micropython

ページ引っ越しました

このページは、以下に引っ越しました。内容も逐次移行中です。引き続きよろしくお願いします。  https://hkaji.github.io →こちら