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

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

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

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!!
コメント

秋月電子のデータロガーを使ってみた。

2018年03月21日 | 電子工作
  • 一般的にデータロガーは値段が高い。そこで秋月電子のデータロガーとシリアル−USB変換ケーブルを購入して使用してみようと考えた

  • ただ、このデータロガーの入力端子はメスピン、実際に使うには使いづらい。そこで木板に基盤を固定して端子台をつけた。

  • データロガーの入力端子と端子台を接続したのは2×20の昔のハードディスクのパラレルケーブル。ピンは順番がバラバラなので端子台に順番に接続した。(マイナスの端子にはGNDを接続)

  • 端子台に可変抵抗器を接続し、スタンドアロンで動作を確認。

  • ログデータを吸い上げるにはPCが必要。そこで接続したPCのOSはUbuntu、Wine上でCD−ROMに入っていたデータ管理ソフト「AKI PIC LOGGER」を動作させ、一通り動作を確認できました。
    (補足:AKI PIC LOGGERは本来Windowsのソフトです。WineはLinux系のOS上でWindowsのソフトを動作させるソフトです。ただ、エミュレータではないらしい。)

  • あと、WineのためにUSBのシンボリックリンクを追加してください。
    ~/.wine/dosdevices/ に
    ln -s /dev/ttyUSB0 com1

    以下のURLを参考にしてください。https://wiki.winehq.org/Wine_User%27s_Guide#Serial_and_Parallel_Ports


  • 今どきのグラフィックが派手なデータロガーと異なり、秋月のデータロガーはかなり地味ですが、データロガーとしての最低限の機能は十分にあります。PCを接続してもリアルタイムでグラフをグラフィック表示できないことはご承知ください。

  • 編集後記:将来、Raspberry PiとPythonを利用して操作したかったので、PC−データロガー間の通信の仕様を秋月に聞いてみたのですが、「ソースコードがCD−ROMに載っているのでそれを参考にしてください」ということでした。結果的に私のスキルでは読むことができませんでした。もともとプログラミングヘタレな私にはアセンブラなんかもっと無理! ただ、UbuntuとCutecom(シリアル通信用ターミナルソフト)を利用し、「V」コマンドでデータロガーのファームウェアのバージョンをターミナルソフトに表示することは成功しました。もし、興味がある方はこれ以降をお願いいたします。

コメント

SHARPのテレビをパソコンからArduino経由で操作する

2018年01月03日 | 電子工作

事の発端はGoogle HomeもどきであるAIY Project Voice Kitを購入・組み立て・インストールして、とりあえず英語で動作するようになって、英語で質問すると時間や天気と答えるようになったが、「じゃぁ、この箱はなにに使えるの?」と聞かれるとなにも使えない。

それじゃ、とりあえず目の前のテレビを操作しようということになって始めたプロジェクトがこれです。

実は最初は中に入っているRaspberry Piから直接赤外線LEDを発光させてテレビを操作しようと思ったのですが、Linuxのリモコン操作のライブラリーがバージョンによって使い方が違うということが判明しまして、さらに英語が大の苦手な私にとって最新のライブラリーの使い方を理解することは不可能と判断しまして、基本的に赤外線LEDの発光はArduinoにお任せしようとなったわけです。

ここまで引っ張っておきながら今回AIY Project Voice Kitには全く触れていません。

今回のブログはパソコンからシリアル通信でArduinoに文字データを送り、赤外線LEDを 発光させるだけです。

動作確認はSHARP LC-42EX5だけです。

AruinoのスケッチはPanasonicとなっていますが、赤外線の発光パターンがパナソニック形式だっただけで、このスケッチで操作しているのはSHARPのテレビです。(信号コードを変更してあげれば可能だと思う)

スケッチや回路図などのデータは今回からGithubに載せてみました。

SoratobuMacaroniPenguin/PansonicIrRemote

なにか不具合点や質問、要望などコメントしてください。

最後にArduinoのIRremoteライブラリーを開発してくれたKen Shirriffに感謝します。

 

 

 

コメント

Raspberry Piで監視カメラをつくる

2017年04月06日 | 電子工作

息子の部屋でお菓子が無くったという連絡を受けて、監視カメラを作るプロジェクトを立ち上げました。

ハードルは大きく分けて3つ

1.LinuxのプログラムMotionを使いこなす
2.Sambaの設定をする
3.Raspberry Piのメモリーを利用するため、ある程度画像が溜まったら自動的に削除するプログラムを作る



1−1 Motionをインストールをする sudo apt-get install motion
1−2 /etc/motion/motion.confの設定をする
1−3 設定値はサンプルを基本にして適当に設定しました。(静止画のみ、3秒おきに撮影、640×480) ※変更箇所のみピックアップ 

width 640
height 480
minimum_frame_time 3
threshold 4000
ffmpeg_output_movies off
target_dir /home/pi/Pictures
stream_port 0 


1-4 webcontrol_port 8080 であればブラウザで設定ができます。Raspberry Pi上のブラウザのURL欄に127.0.0.1:8080を入力してください。ただし、設定完了後にはSaveをお忘れなく

1−5 デーモンで動かす

 

2−1 Sambaの設定はSambaのホームページからサンプルをダウンロードして多少変更して使用しています。
「Chapter 2. 手軽な始め方: 短気な方への手引き」の「スタンドアローンサーバー」の「Example 2.1. 匿名リードオンリサーバー設定」を参考に設定しました。
ちなみにこの設定では外部から写真を閲覧はできますが、削除はできません。


 
3−1 ある容量以上に達した場合、古いファイルから削除するスクリプトをPythonで作ってみました。

# coding: Shift_JIS
import os
from operator import itemgetter
picture_space = 30720                       # 30720 = 30 * 1024

d_name = '/home/pi/Pictures/'
file_list = []
size_counter = 0

#ファイルデータ取得
for file in os.listdir(d_name):
   file_info = os.stat(d_name + file)
   file_list.append([d_name + file , file_info.st_mtime , int(file_info.st_size / 1024)])
   size_counter = size_counter + int(file_info.st_size / 1024)

#古い順にソート
file_list.sort(key = itemgetter(1))

#ファイルの削除
for file in file_list:
   if size_counter > picture_space:
     size_counter = size_counter - file[2]
     os.remove(file[0])
   else:
     break



コメント

chibi:bitを手に入れて、プログラムを書いてみた

2016年08月31日 | 電子工作

MakerFaireTokyo2016
スイッチサイエンスで手に入れたchibi:bitですが、様々な問題(Bボタン問題とWindows10AnniversaryUpdate)を乗り越え、やっとのことでプログラムが完成しました。

コンパスです。
ネットに掲載しているプログラムを参考にしましたが、最終的に矢印が常に北を指しているプログラムはオリジナルです。

実はこのブロックのプログラムを公開したいと思い、とりあえずプリントスクリーンしたのですが解像度が足りなくなってしまい、うまく公開することができません。
次に文字スクリプトにコンバートしてみたのですが、コピーすることができません。

なんかいい方法はないものですかねぇ。

このchibi:bitはBBC micro:bitの互換機です。
その中にはBluetooth、磁気センサー、5×5LED、ブロックによるプログラムなどいままでにない素晴らしいワンボードマイコンなのですが、かなり惜しいです。
先ほど話したネットでの公開方法も惜しいと思えることの一つです。
その他、入出力端子が基板の端についているというのはとっても斬新なアイデアなのですが、接続できるスロットが手に入らない。(もしかしたら、私が見つけられないだけなのかもしれないが、見つかる気配がない)
さらに情報が少ない。

私自身、実はこのchibi:bitが初mbedなのです。
いままでarduino推しだったのでmbedに触ったことがなかったのですが、結構面白いと思います。
ユーザーがネット上に掲載する情報がもっと多くなったら、とってもよいマイコンボードになると思います。

コメント

家庭用NASを作っています。

2015年07月26日 | Linux
なんか、家族の個人個人がパソコンなりタブレットやスマホを持つようになり、データの一元管理がしたくなったのでNASを作ろうと計画しています。

パソコンは以前、WindowsXPが動いていたやつを利用します。
OSはOpenMediaVaultを選びました。

インストールは他のホームページを参考にしていただくとして、問題はPCに接続されているHDDが1台だけだと何かと不都合であるということです。

このOpenMediaVaultはインストール時にはハードディスクのすべての領域をOSとしてインストールしてしまいます。
確かに仕事等で使えのであればOS用のHDDとデータ用のHDDは別にするのでしょうが、個人で使用するNASにはたかだか2GBのOS領域のためだけにHDDをまるまる一台さくなどはできません。それに最近のHDDの容量はデカイですからね。

そこで、1台のHDDでOS領域とデータ領域をシェアする方法を書きます。

まずはUbuntuなどのイメージファイルをダウンロードしたものをCDに焼いておきます。

それからOpenMediaVaultをインストールします。(この場合、クリーンインストールしますのでHDDに入っていたデータは全て消えます)



それからCDに焼いたUbuntuをLiveCDとして起動し、GPartedを起動しパーテーションの領域の変更をします。


そのまま、このソフトで空きとなった領域に新しいパーテーションを作成します。

再び、OpenMediaVaultを起動すれば、WEB画面からデータ領域を指定し、使用することができます。
コメント

LEDの照明器具の調光装置を自作する

2015年05月06日 | 電子工作
概要
俗に蛍光灯が一般的だった時代が終わりLEDと変わりました。
40W2灯用逆富士型蛍光灯器具いわゆる「逆富士」で通っていた名称もLED時代には形も変わり「ベースライト」という名称が一般的になりました。

我が家の子供の部屋の2段ベット風ロフトの下が暗いのですが、明るさの調整が微妙だということで調光付きのLEDベースライトをつけようと思いました。当然ながら照明器具だけでは調光ができず、別途調光装置が必要です。しかし、メーカー製の調光装置は値段が高い。
そこで電子工作で何とかならないかと考えたのが今回の企画です。

注意事項
しかし、お断りをしておかなければならないことがあります。

当然ながらこの記事を読んで同じものを作ってみようと思われることは大変結構なことですが、自己責任でお願いいたします。
それからもっと大切なことですが、この記事を書いている時点で実際にLEDベースライトで動作を試せていません。

試せていない理由はLEDベースライトを間違えて購入してしまったからです。
読者の方に同じ轍を踏まさないためにも間違えた理由をここに書いておこます。

私の場合、蛍光灯換算で20W1灯用タイプのベースライトを買いました。
本来購入しなければならなかった蛍光灯器具は
三菱電機製 組み合わせ形名 MY-L215030N AZH(ライトユニットEL-LU21503N AZH + 器具EL-LHL20700)ですが、
実際には私がAZHというところを未記入で発注してしまったため、電材屋さんで一般時な方のAHTNの記号が補填され 
三菱電機製 組み合わせ形名 MY-L215030N AHTN(ライトユニットEL-LU21503N AHTN + 器具EL-LHL20700)
が来てしまいました。
開封前に気がつけば返品もできたのでしょうが、調光ができないことがわかってから型番が違うことに気がついたのでかなりの後の祭りでした。


とりあえず作ってみた
ArduinoのPWM機能を使います。ArduinoのPWMの出力は5V、ベースライトのPWMの入力信号は10V前後らしいのでトランジスタで増幅します。



int analogPin = 3;
int pwmPin = 3;
int val = 0;

void setup() {
}

void loop() {
  val = analogRead(analogPin);
  analogWrite(pwm Pin, val / 4);
}


とりあえず動かしてみた

実際は

このようになります。

簡易ですがオシロスコープで見てみました。
Arduinoの出力はきれいなパルスだったのですが、トランジスタを通した途端に汚いパルスになってしまいました。
原因は二次側に接続されていないからだと思われます。


早めに今あるLEDベースライトの行き先を決めて、新たに調光付きLEDベースライトを購入して試してみたいと思います。


コメント

Arduono+Python+Firmataの今日の成果

2014年11月26日 | 電子工作
先日のラズパイコンテストに応募してから逆にArduono+Python+Firmataに魅せられて、頑張っています。(念の為、別にRaspberryPiが嫌いというわけではないです)

とりあえず、今日完成した成果から

Arduonoのシールドは何年か前のMakerFaireTokyoでスイッチサイエンス + セニオネットワークのワークショップに参加した時に娘がハンダゴテを使用して作った「五徳バーLEDシールド」です。

その時に使われていた教科書がどこかに行ってしまったので逆にハード側から調べたのですが、バーLEDのしくみが分からない。
ホント、四苦八苦して調べたら、Complementary LED Driveという方式で点滅していることが判明。

参考:パレットソフトさんの複数LED制御のページの「サンプルプログラム(その2:Complementary LED Drive)」という項目。

とりあえず、作ってみたスケッチはこちら

from firmata import * 

a = Arduino('/dev/ttyUSB0',baudrate=57600) # 3 for COM4

#[Z,Z,Z,L,H]→Z:入力にするポート、L:出力LOWにするポート、H:出力HIGHにするポートの順番で配列(リスト)

led_matrix = [[2,3,4,1,5],[1,3,4,2,5],[1,2,4,3,5],[1,2,3,4,5],[2,3,5,1,4],[1,3,5,2,4],[1,2,5,3,4],[1,2,3,5,4],[2,4,5,1,3],[1,4,5,2,3],[1,2,5,4,3],[1,2,4,5,3],[3,4,5,1,2],[1,4,5,3,2],[1,3,5,4,2],[1,3,4,5,2],[3,4,5,2,1],[2,4,5,3,1],[2,3,5,4,1],[2,3,4,5,1]]


def led_print(n):
#毎回、一旦全部のポートを出力LOWにしている。
    for j in range(5):
       a.pin_mode(n[j] + 4, firmata.OUTPUT)
       a.digital_write(n[j] + 4, firmata.LOW)

#入力にするポート、出力LOWにするポート、出力HIGHにするポートの順番で設定

    print 'SEG' + str(n[0] + 3) + '= Z'
    a.pin_mode(n[0] + 3, firmata.INPUT)

    print 'SEG' + str(n[1] + 3) + '= Z'
    a.pin_mode(n[1] + 3, firmata.INPUT)

    print 'SEG' + str(n[2] + 3) + '= Z'
    a.pin_mode(n[2] + 3, firmata.INPUT)

    print 'SEG' + str(n[3] + 3) + '= L'
    a.pin_mode(n[3] + 3, firmata.OUTPUT)
    a.digital_write(n[3] + 3, firmata.LOW)

    print 'SEG' + str(n[4] + 3) + '= H'
    a.pin_mode(n[4] + 3, firmata.INPUT)
    a.digital_write(n[4] + 3, firmata.HIGH)

    a.delay(0.02)

#本文
a.delay(2)
while 1:
    for i in range(20):  
        print str(i) + " = " + str(led_matrix[i])
        led_print(led_matrix[i])


まあどれをとっても最初にしては上出来では・・・
コメント