マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

MicroPythonでI2CインターフェースのLCDに表示する 第3弾

2022年04月23日 | 電子工作

今回はカタカナ文字に対応しました。
入力はあくまでも半角のカタカナでお願いします。

書き込むスクリプト名をacm.pyとした場合

import acm
acm.clear()
acm.send_text('キョウハイイテンキ')

とすれば表示します。

さらにこのlcdには「千」とか「万」とか「円」とか表示できるのですが、これは

acm.cmd(0x80,0xfa)   → 千
acm.cmd(0x80,0xfb) → 万
acm.cmd(0x80,0xfc) → 円

で、直接コードを叩いてください。

最後に一ついいわけなのですが、本当はencodeする際にshift-jisを指定すればよいのですが、本家のPythonはうまくエンコードできたのですが、MicroPythonのほうが対応していなくてうまく動作しませんでした。 MicroPythonのフォーラムに書き込みましたが、対応してくれるかどうか・・・・ 
なんとかカタカナが表示できたので、やっと次のステップに進めそうです。

#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin
#Version 2022.04.15 Choco-Tips.comバージョンをESP32に対応 ブログバージョン
#Version 2022.04.20 様々なプラットフォームに対応
#Version 2022.04.23 カタカナ表示に対応

import sys
from time import sleep
from machine import Pin
LCD_ADDR = 0x50
platform_name = sys.platform
if 'esp8266' == platform_name:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)
elif 'esp32' == platform_name:
    from machine import SoftI2C
    i2c = SoftI2C(scl = Pin(22),sda = Pin(21),freq = 100000)
else:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)

def cmd(a, b, msec = 0):
    buff = bytearray(2)
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    for ch in text:
        list_t = []
        list_t1 = []
        list_t = ch.encode("utf-8")
        for i in list_t:
#            print ("i",hex(i))
            if i < 0x80 or 0x9f < i:
                list_t1.append(i)
            else:
                list_t1.append(i+0x40)
        cmd(0x80,list_t1[-1])

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("タズネツヅケナサイ")
    move_cur(0, 1)
    send_text("モトメツヅケナサイ")

if __name__ == '__main__':
    print_test()


MicroPythonでI2CインターフェースのLCDに表示する on ESP32

2022年04月15日 | 電子工作
久しぶりにマイコンボードに触りたくなって、MicroPythonを書き込んだESP32でI2CインターフェースのLCDに表示することにしました。

以下の内容は記載しません。MicroPythonのオフィシャルなどのホームページを参考にしてください。
ESP32にMicroPythonのファームウェアを書き込む方法
ESP32にPythonのスクリプトを書き込み方法
対話型ウィンドウ=REPLの操作方法

MicroPythonでI2CインターフェースのLCDにアクセスしている記事は多々ありましたが、参考にしたのはhttps://choco-tips.comの「ラズベリーパイ I2Cキャラクターモジュールを使う」です。Raspberry PiでI2CインターフェースのLCDのアクセスしている記事でした。 importしているライブラリー名などを多少変更するだけで使用することができました。
あと、私が持っているESP32がI2Cと相性が悪いのかわからないですが、ハードウェアI2Cだとうまく動作せず、ソフトウェアI2Cを使用しています。
#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin

from time import sleep
from machine import Pin,SoftI2C
i2c = SoftI2C(scl = Pin(21),sda = Pin(22),freq = 100000)
LCD_ADDR = 0x50
buff = bytearray(2)

def cmd(a, b, msec = 0):
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    bin = text.encode("utf-8")
    for ch in bin:
        cmd(0x80, ch)

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("Keep on asking, ")
    move_cur(0, 1)
    send_text("Keep on seeking.")

if __name__ == '__main__':
    print_test()

手軽にPLC(Programable Logic Controller)を使ってみる

2022年01月16日 | 電子工作
以前よりPLC(Programable Logic Controller)を触れたいと思っていた。世界では様々なPLCメーカーが存在するらしい。日本でも制御機器で有名なメーカーが製造販売を行っている。しかし、メーカー製PLCを使用するためには開発ソフトが必要。しかし、開発ソフトの値段がものすごく高価です。さらにA社の開発ソフトはA社のPLCにしか使えず、B社のPLCには使えない。本職ならまだしも「試しに使ってみたい」というレベルのユーザーをことごとく排除したいのではないかと思うほどのものである。さらに本体も必要以上に高性能で「もっと機能を減らした安価なPLCを作っても良いのでは」と思えるほどである。

そこで不本意ながら他国で製造販売している簡易PLCとも言えるようなPLCとオープンソースの開発ソフトを使ってPLCの開発をしてみたいと思う。

本体
 メーカー名 eletechsup  (基板に記載なし。ホームページなど漁って、このメーカーだと思われるが確信なし。ホームページなし。)
製品名 IO22C04 (私はAliexpress の eletechup Outlet Storeで購入、本家本元かどうかは不明。ただ、ある質問をした時にネットで公開されていない図面を所有していた)
 コントローラー Arduino Pro Mini互換 5V 16MHz(IO22C04に付属していたものを購入)

 
USB−シリアル変換
 メーカー名 sparkfun
 基板名 FT232RL搭載小型USB-シリアルアダプタ 5V  (私はSwitchScienceで購入、リンク先のものは私が所有しているものよりバージョンが進んでいるみたい)
 Arduino Pro Mini互換機との端子の位置が異なるので変換ソケットを作成した。5V−5V、GND−GND、RXI−TXO、TXO−RXIにつなぐ

 
開発ソフト
 開発ソフト名 OpenPLC Editor
 ランタイム環境・書き込みソフト OpenPLC Runtime 
 開発者 Thiago Alves

お使いのパソコン環境に合わせてOpenPLC EditorとOpenPLC Runtimeをインストールしてください。Windowsの場合はOpenPLC Runtimeをインストールすると自動的にEditorの方も一緒にインスールするらしい。これは本家のホームページで確認してください。(ここでは詳しく説明はしません。ごめんなさい)

OpenPLC EditorはSlave Deviceに関係なく、プログラムできます。
シミュレーターには2種類あって、パソコン上でシミュレーションをする場合とSlave Deviceをつなげてシミュレーションする場合があります。
Slave Device(例えばArduinoなど)をつなげてシミュレーションする方法をOpenPLCではRuntimeと言います。コントローラーはArduino Pro Mini互換機ですがGPIOの割り当てが元のOpenPLCとIO22C04は異なります。

もともとのOpenPLCはBeforeの欄になります。IO22C04はAfterの欄になり、そのためArduinoのスケッチを変更する必要があります。
それが、OpenPLC_IO22C04.inoになりますので、OpenPLC Runtimeインストール後、OpenPLC_ArduinoNano.inoと入れ替えてください。
 あと、RuntimeのWEB画面上でSlave DevicesタブのDevice Typeの設定ではArduino Unoを設定せずに、「Generic Modbus RTU Device」にしてください。それから「Discrete Inputs」は0から8「Coils」も0から7にしてください。
COM Portはそれぞれの使用者の方のパソコンに合わせて設定してください。
最後にラダープログラムを作成する場合、先に掲載した対応表を参考にしてください。
サンプルとしてLadder_for_IO22C04.zipを掲載しておきます。

OpenPLCの使い方は南先生のYoutubeが参考になりました。

私はgithubはこちらです。このブログに載せてあるスケッチなどはここにリンクを貼っています。

また、IO22C04の回路図Aliexpress の eletechup Outlet Storeの方からいただきました。ありがとうございます。

最後に手をつけていない箇所があります。Seven-segment Displayです。
OpenPLCのラダープログラムからSeven-segment Displayに表示できたらどんなに便利でしょうと思ったのですが、私のスキルではシフトレジスターを解決することができませんでした。 どなたか挑戦していただける方がいらっしゃいましたら、よろしくお願いします。


[つくれぽ]PIC MicroControllerに秋月のLCDをつなげてみた

2021年10月24日 | 電子工作
つくれぽ(※1)です。
出典はeloctroSomeというサイトのInterfacing LCD with PIC Microcontroller – MPLAB XC8というページ。
このサイトではPICは16F877Aを使用していますが、私は16F84しか持っていなかったので、そこのところを修正しています。
あと、lcd.hをインクルードしてください。
プログラムの最初の部分のみ掲載します。残りの部分は上記のサイトを参考にしてください。
#define _XTAL_FREQ 10000000
// PIC16F84 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is disabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#define RS RB0
#define EN RB1
#define D4 RB5
#define D5 RB2
#define D6 RB4
#define D7 RB3
#include <xc.h>
#include "lcd.h"









※1:私の解釈での「つくれぽ」=クッキングレシピ紹介サイトで公開されているレシピを読者が自分で作ってオンライン上で作った料理をレポートすること。そしてレシピを紹介してくれた人への感謝を表すること。


久しぶりにPIC MicroControllerの世界へ

2021年10月16日 | 電子工作
 娘の宿題がPIC MicroControllerでのプログラミングだった。結局、ニッチもサッチもいかないので開発環境だけでも整えようと現在のPICの状況の把握から始まった。
 私がPICを知ったのはArduinoよりもかなり昔で、開発環境はアセンブラだった。 当時はこれしかなかった。 ライターも当時の私にとっては正規品は値段が高く、秋月のキットをはんだ付けして作って使う方法しかなかったのだが、組み立てて書き込みもした。 しかし、そのライターもいつの間に使えなくなってしまった。(今回、この壊れた原因も偶然にもネット検索をしていたらわかったのだが・・・)
 現在、PICの開発環境はアセンブラだけではなく、C言語が使えるようになっていた。それもXC8というらしい。(もっと言っちゃうとその前にもう一つC言語のバージョンがあったらしい)
 今回、ライターは「正規品風のコピー品」をアマゾンで購入した。 ネットを読んでいるとコピー品はちゃんと使えるものと使えないものがあるそうだが、とりあえず使えると言われているそっくりさんを買った。

 今回、娘の学校の先生もなかなかの根性のある方なのか、それとも新しいものを良しとしない方なのかわからないが、いまだにアセンブラを使用している。ブレない根性、ある意味すごい!! 
 しかし、私にはアセンブラがわからない、というか思い出せない、昔の本を引っ張り出して読んでみても理解できない。(別にC言語が得意なわけでも、他にこの言語を使ってくれという得意な言語があるわけではないのだが、正直アセンブラよりはC言語のほうが良いと思うなぁ。)

 Microchipにはもう少し無料で読めるドキュメントを希望します。それからLCDのライブラリーが見つかりません。きっとこれは1から作れってことですよね。作ってオープンソースで公開するのがベストなんでしょうね。

とりあえず、組み込み技術者のための MPLAB® XC8ユ ーザガイドを参考にしてLチカがんばります。

追記、Lチカできました。
しかし、参考にしたのは上記のチュートリアルではなくってGetting Started with MPLAB XC8 Compiler – LED Blinkingです。当然、Google翻訳のお世話になっています。 私が使ったのはPIC16F84と箱の奥の方に眠っていた文字が読めないセラロックです。
しかし、動作が不安定でした。MCLR端子を5Vにつないだら安定しました。参考までに

簡易的パルスオキシメーターを作る

2021年08月27日 | 電子工作
fabcrossの「パルスオキシローターを自作しよう」の記事を読んで、「将来、必要になるかも・・・」ということからスイッチサイエンスに注文しました。 
ただし、心拍センサーを購入するだけではだめで、M5Stack社のM5StickCも一緒に購入してください。それもM5StickCにはいくつかの種類があるのでこれから購入する人はM5StickC Plusが良いと思います。
私はM5StickCを買ってしまったので、M5Stack社のサンプルに変更が必要になりました。(ちょこっと、だけですが)



作業内容:

PlusのほうではないM5StickCとして話を進めていきます。
  1. パソコンにArduinoIDEをインストールをする
  2. USBケーブルでM5StickCをPCを繋ぐ
  3. ボードマネージャーにM5Stick-Cをセットする。(設定の仕方は他のページを参考にしてください)
  4. つながっているUSBのポート番号をセットする
  5. ライブラリー管理で「M5StickC」をインストールする
  6. ライブラリー管理で「SparkFun MAX3010x Pulse and Proximiy Sensor Library」をインストールする
  7. ライブラリーインクルードでM5StickCとMAX3010xのライブラリーをインクルードする
  8. M5Stack社のHeart Rate Hatのページにあるサンプルをダウンロードする。
  9. 最後にサンプルの中の5行目の
    #include <M5StickCPlus.h>  を
    #include <M5StickC.h> に変更する
  10. コンパイルして書き込み
これだけで、使用できるようになりました。


ちなみに罹患してない(と思われる)私が測定するとSPO2=100となっています。(うーん、どこまで正確なんだろー)

あくまでも簡易的なパルスオキシメータです。医療用としては使用できません。

コロナ禍が終わったら、M5StickCは別の用途に使えます。 その時は何に使おうかなぁ。

秋月のGPSの信号をBluetooth経由でケータイに転送してみた

2021年05月30日 | 電子工作
きっかけ
スマホのGPSの調子が悪くなって、ナビができなくなったことがきっかけでした。
(ただし、これには後日談があって、修理に出したら治ってしまいましたので、動機はなくなってしまいました)
方向性
スマホ内蔵のGPSを使用せずに、外部のGPSで信号を受信し、Bluetoothを利用してスマホに転送し、エミュレータのようなもので内蔵GPSと偽ってGoogleマップに送れば、正しくナビができるようにする(はずだった・・・)
用意するもの
Raspberry Pi(今回使用したのはバージョン1Model Bを使用)
スマホ
Raspberry Piのセットアップ
ラズパイのセットアップは割愛します。
デスクトップ起動をやめて、コマンドラインで起動
raspi-configで「インターフェイスオプション」-「シリアルポート」から「ログインシェルにアクセス」はNO、「シリアルポートハードウェアを有効」はYES
sshを許可
node-redをインストール
コマンドラインでnode-redを自動的に起動するようにする
sudo systemctl enable nodered
IPアドレスを固定する(詳しくはネットで検索してみてね)
配線をする

秋月のBluetoothキットにはUSB変換が内蔵されているが、Fritzingにはそのようなデータがなかったので、テキトーに作ってみました。
Node-REDを立ち上げてみる
ホストコンピューターのブラウザーから固定されたipアドレスにポート番号を付けて、Node-REDを開いてみる
例えば、我が家の場合 192.168.3.71:1880
 
/dev/ttyAMA0につながっているGPSを入力にして、/dev/ttyUSB0につなかっているBluetoothモジュールに出力しています。
(msg.payloadはデバックのためにディスプレイに出力しているだけで、実際には必要ありません)
スマホで受信してみる
スマホにアプリをインストールする Serial Bluetooth Terminal
Bluetoothのバインドをする
Serial Bluetooth Terminalをひらいて、スマホからのデータを受信してみる

最終目標
本来だったらGoogle PlayからGPS Connectorをインストールして、Googleマップでナビをする予定だったのですが、Google Playからこのアプリが無くなってる!!(管理者モードに入らなければならなかったし、ちょっとリスキーだったから、それが引っかかったかな?) 
またしても最後の一歩足りなかったぁ。
編集後記
前回のブログから1年以上もたってしまいました。 単純に私の電子工作の記録簿なので「どうしても書かなければいけない」というプレッシャーはないのですが、電子工作をする時間を作ることができなかったという反省は大いにあります。




ArduinoでPLC(Programmable logic controller)みたいなことをしてみた。

2020年02月08日 | 電子工作
様々な理由により、メーカーから販売されているPLCを使用しないで電子工作でPLCみたいなことをすることにした。

白羽がたったのは、昔ながらのArduinoだ。
(Raspberry Piを使用しなかったのは実は理由がある)

ラダーエディターは当初、LDmicroを使うつもりであった。(私の開発環境はUbuntuなのだが、wine上でLDmicroが動きました。)
結果的にはラダープログラムからarduino IDEに変換がうまく行きませんでしたので、ラダーの部分のみ使用させていただくことにしました。



回路はこんな風に配線しました。

arduinoの向こう側はただの端子台です。入力の端子を意味します。
こちら側にあるのは8 Relay Moduleです。出力を意味しています。
入力はプルアップ回路がめんどくさいので、ソフト上でPULL_UPしています。(これはSwitchSceinceさんのブログを参考にさせていただきました。)また、ソフトでPULL_UPすると動作が逆になるのでビックリマークで逆転しています。
リレーは「8 Relay Module」で調べるとだいたい出てきます。ただし、そのまま接続してdigitalWriteすると動作が逆になるので、これもビックリマークで逆転させています。また、 arduinoの5V端子から8台のリレーをいっぺんに駆動しようとすると電圧降下が起きるらしく、誤動作します。 別電源にすることをおすすめします。

arduinoのプログラムはこんなふうに作成しました。

 
  boolean x00 = false;
  boolean x01 = false;
  boolean x02 = false;
  boolean x03 = false;
  boolean m00 = false;
  boolean m01 = false;
  boolean m02 = false;
  boolean m03 = false;
  boolean m04 = false;
  boolean m05 = false;
  boolean m06 = false;
  boolean m07 = false;
  boolean y00 = false;
  boolean y01 = false;
  boolean y02 = false;
  boolean y03 = false;
  boolean y04 = false;
  boolean y05 = false;
  boolean y06 = false;
  boolean y07 = false;

void setup() {
  pinMode(2, INPUT_PULLUP); //x00
  pinMode(3, INPUT_PULLUP); //x01
  pinMode(4, INPUT_PULLUP); //x02
  pinMode(5, INPUT_PULLUP); //x03
  pinMode(6, OUTPUT);             //y00
  pinMode(7, OUTPUT);             //y01
  pinMode(8, OUTPUT);             //y02
  pinMode(9, OUTPUT);             //y03
  pinMode(10, OUTPUT);           //y04
  pinMode(11, OUTPUT);            //y05
  pinMode(12, OUTPUT);            //y06
  pinMode(13, OUTPUT);            //y07
}

void loop() {
// 入力部分
  x00 = !digitalRead( 2 );
  x01 = !digitalRead( 3 );
  x02 = !digitalRead( 4 );
  x03 = !digitalRead( 5 );  

// 実際のプログラム部分(開始)

  y00 = ( x00 || y00 ) && !(x01);

// 実際のプログラム部分(終了)

// 出力部分
  digitalWrite( 6 , !y00);
  digitalWrite( 7 , !y01);
  digitalWrite( 8 , !y02);
  digitalWrite( 9 , !y03);
  digitalWrite(10 , !y04);
  digitalWrite(11 , !y05);
  digitalWrite(12 , !y06);
  digitalWrite(13 , !y07);
}


PLCとしてのプログラムは「実際のプログラム部分」の一行のみです。 このプログラムの内容としては保持回路です。


ホストPCをUbuntuした場合、Donkey Carの学習データを転送する方法

2019年07月15日 | 電子工作

私のDonkey Carの学習にはFaBoさんのColabでの学習を利用させていただいています。(他の方法を使用したことがないので比較はしていませんが、きっと早いのだと思う)

ただ、ホストPCにUbuntuを使用しているので、多少ですがWindowsPCで行う場合とファイルの転送方法が異なります。
  1. Ubuntu側でLXTerminalを2つ立ち上げます。
  2. 一つはDonkey CarのRaspberry PiへSSH接続用端末 ・・・・ 端末1
  3. もう一つはUbuntuでRapspberry Piとのデータ転送を指示するための端末です ・・・・ 端末2 
  4. 端末1で以下のコマンドでSSH接続します。
    slogin pi@192.168.1.5
  5. 走行データを圧縮します。
    zip -r datas.zip ~/mycar/data/tub_01_19-07-17
  6. Ubuntu側からRaspberry Pi → Ubuntuにファイル転送する
    端末2で以下のコマンドを打ちます。
    scp pi@192.168.1.5:/home/pi/mycar/data/datas.zip .
    最後のドットは忘れずに!
    192.168.1.5はRaspberry PiのIPアドレスです。各自で変更してください。
    Raspberry Piのパスワードを聞いてくるので、入力してください。
  7. Colab上での学習を行う。この部分はFaboさんの資料を参考にしてください
  8. ダウンロードした学習済みデータをRaspberry Piに送り返す。
    端末2で以下のコマンドを打ちます。
    scp mypilot pi@192.168.1.5:/home/pi/mycar/models
  9. 端末1で転送されたことを確認する。
    ls ~/mycar/models
P.S.ワタシ的にはDonkey Carに使われているRaspberry PiのOSもLinux系、ホストPCもLinux系だと頭の切り替えが少なくて済み、ストレスが少ないように感じますがいかがでしょうか。

SwitchScience製ESPr® Developer(ESP-WROOM-02開発ボード)でMicroPythonを使う

2018年04月21日 | 電子工作
インタープリターのPythonをマイコンボードで使用できるなんて、もしかしたらマイコンボードの最終型なのではないか(ちょっと言い過ぎ)、もっと言ってしまうとMicroPythonを動かすためにマイコンボードは進化を続け、私もこれに出会うために生まれてきたのではないかという信念を持って、このMicroPythonに取り組んでいます。
 
私が使用しているパソコンのOSはLubuntu1804です。使ったボードはSwitchScienceESPr® Developer(ESP-WROOM-02開発ボード)です。今ではESP-32がでてきてから、ちょっと肩身の狭くなってしまったチップですがまだまだいけます。
 
MicroPythonのホームページからesptool.pyesp-8266**.binをダウンロードしてきてから
まずはフラッシュをクリアします。
sudo python3 esptool.py --port /dev/ttyUSB0 erase_flash
次にボードにMicroPythonを書き込みます。
 sudo python3 esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20171101-v1.9.3.bin 
次は MicroPythonをインストールしたボードと通信するソフトをLubuntuにインストールします。
sudo apt-get install picocom
コマンドプロンプトでpicocomを起動してMicroPythonにアクセスします。
sudo picocom /dev/ttyUSB0 -b115200
次はUSBからではなく、Wi-FiからMicroPythonにアクセスすることができるらしいけど、英語が難しくって理解できないんだよね。
どなたか協力してください。お願いします。 
参考したホームページは
https://micropython.org/
https://github.com/micropython
です。
Enjoy Python!! Enjoy MicroController!!