こんにちは!
昨日は春一番が吹いてとても暖かく、少し嬉しくなったゆってぃです。
でも、今日からまた寒くなってしまい、ちょっぴりがっかりしています。
なんでこう、春を小出しにするんですかね。

最近はサーバやらAIやらに興味が向いていて、電子工作らしい電子工作はお休みしていたのですが
諸事情により再開いたしました!
作るものは明確になっていて
DMX512という舞台照明用の通信規格を使って、ステッピングモータを動かす装置
です。
「DMXって何?」という人は、タマテックさんのサイトが驚異的に分かりやすいので、是非ご覧になってみてください。

DMXは舞台照明用の規格ですが、物理層はRS485なので、RS485トランシーバを使用すればマイコンで送受信できます。
キャノンケーブルやコネクタも、サウンドハウスさんなどで簡単に手に入るので、回路は簡単に作れそうです。

ただ、DMXのプロトコル自体は公開されているものの、ドライバを書くのは少し骨が折れるのでネットで探したところ、arduino向け拡張ボードarduino向けライブラリを発見しました。
(このライブラリはLGPLv3でライセンスされています。Arduino向けというよりAVRマイコン向けなので、別のプラットフォームへの転用は簡単に出来ますが、商用利用する方はリンクされるコードや開発環境(リバースエンジニアリング環境)も公開対象となる場合があるのでご注意下さい。少なくとも、arduinoで使用する場合は動的リンクではないので、商用利用する場合はリンクされる側のコードも公開対象になります)
今回はプロトタイプなので、ArduinoUnoと、この拡張ボードで、DMXモータ制御装置を作りたいと思います^^

電子工作で使用されるステッピングモータとしてはSM-42BYG011が王道ですが、今回はターゲットが少し大型のものでトルクが不足していたため、高トルクのST-42BYH100にしました。(どなたかこのモータのトルク特性図のありかを知りませんか…涙)
使用するモータードライバ(DRV8835)自体は各相あたり1.5Aを流すことが出来るので、ST-42BYH100(1A/相)でも定格上は問題ありませんが、実際に使用する際は回路にヒートシンクを取り付けるなどして放熱を行ってください。

それでは、さっそく作っていきましょう!!!
まず、簡単な外部仕様から。
DMXのプロトコルにはチャンネルという概念があり、0ch~511chまでの好きなチャンネルを自身に割り当てることが出来ます。
(システムの中で重複してはいけませんが、1つのデバイスで複数のチャンネルを用いることは可能です)
今回はテストですので、開発対象のデバイスでは、0chと1chを使うことにしました。
0chで停止位置を、1chで移動速度を設定することにします。
また、モータは以下の条件で停止します。
(1)停止位置までモータを動かした(従来のstep()と同じ動作)
(2)停止センサが反応した
(3)非常停止スイッチが押下された

arduinoではStepperというステッピングモータ用ライブラリが用意されています。
このライブラリは大変便利なのですが、一度モータを回転させ始めてしまう(回転用API:step()をコールする)と、step()関数が終了するまでモータを停止できないという制約があります。
この制約は、実使用ではそれなりに大きなインパクトを与える場合があります。

通常のモータ制御プログラムでは、停止スイッチが押された場合や、停止センサが反応した場合に、即座にモータを停止したいというシーンが多いです。
例えば、インクジェットプリンタ等でキャリッジをステッピングモータで動かしている場合、キャリッジがガイドシャフトの端まで来たら、モータを停止する必要があります。そうしないと、恐らくプリンタは破損してしまうでしょう。
(余談ですが、ゆってぃは前職ではプリンタの組み込みソフトエンジニアをやっていました)
今回のターゲットはセンサ反応時にモータを停止したいので、この仕様のままではいけません。
そこで、以下の3つの案を検討しました。

(1)step()関数の引数を小さい値にしてループで処理し、ループ毎にセンサ出力ポートを見に行き、停止信号が出ていたらモータを停止する。
(2)Stepperクラスを継承したStepperWithSensorクラスを作り、内部でセンサ出力ポートを見て、センサー反応時にモータを停止する。
(3)Stepperクラスを継承したStoppableStepperクラスを作り、stop()メソッドを新たに実装し、stop()メソッドが呼ばれたらモータを停止する。step()関数は、センサ反応時の割り込みハンドラでコールする。

(1)は最も実装が簡単ですが、設計としてはイマイチです。
センサを見るために定期的にモータを停止するので、モータの励磁タイミングがずれるためスムーズな駆動が難しくなりますし、センサー反応と実際の停止位置にズレが生じる可能性もあります。

(2)も(3)は一長一短ですが、(3)の方が望ましいと言えます。
なぜなら、(2)の場合はモータとセンサが密結合となり、モータ停止の条件がセンサに固定されてしまうからです。(3)はモータ停止の条件がセンサによらないので、例えば緊急停止スイッチを付けた場合などにも対応可能です。
より、今回は(3)で進めることにしました。

※本当にしっかり設計するなら、停止判断クラスを定義し、そのサブクラスのインスタンスをStoppableStepperクラスにコンポジションする、所謂ストラテジパターンにするのが定石です。(2)をより抽象的にした設計ですね。でもあくまでプロトなので、ご勘弁を・・・汗

長くなるので、コードは次の記事で紹介します。
関連記事
こんばんは、ゆってぃです!
昨日から左膝を曲げると痛いのですが、これが間接痛というヤツでしょうか…?

遅ばせながら、最近になってディープラーニングを勉強し始めました。
Amazonでオライリー社の参考書を買って、読んでいます。
非常に読みやすい上、大切な部分はきっちり押さえているので、オススメの一冊です。

この本に書かれた内容でディープラーニングの学習は可能なのですが、環境によっては、この本に書かれた事前準備だけだと上手くpythonが動かない可能性があるので、メモを残します。

OS:ubuntu 16.04(64bit)

○準備
0.Anacondaのインストール
https://www.continuum.io/downloads
上記URLから、Anacondaのインストーラをダウンロードしましょう。
ダウンロードできたら、ダウンロードしたインストーラと同じディレクトリで
$ bash Anaconda3-4.2.0-Linux-x86_64.sh
と入力しましょう。
インストールが成功すると、ホームディレクトリにanaconda3というフォルダが作成されます。

1.pyenvのインストールとPATHの設定
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

ダウンロード完了後、ホームディレクトリの.bash_profileに以下を追記します。
(.bash_profileが無い場合は、作ってください)

export PATH=$PATH:$HOME/anaconda3/bin
export PATH=$PATH:$HOME/.pvenv/bin
eval "$(pyenv init -)"

因みに、bash_profileに記載せず直接pyenvを叩こうとすると、「なに横着しようとしてるんや。bashrcかbash_profileに書けやコラ」と言われます。。。

ちゃんと書けたら、読み込ませましょう。
$ source ~/.bash_profile

2.python 3.5.0のインストール。
$ pyenv install 3.5.0

もしかしたら、ここで
ERROR: The Python ssl extension was not compiled.
のようなエラーが出るかもしれません。これはlibsslが無いよというエラーです。
その場合は、
$ sudo apt-get install libssl-dev
と打ち、libsslをインストールしてください。

3.pythonの設定
$ pyenv shell 3.5.0

以上で準備は完了です。
バンドでHPを作っているのですが、せっかくだから分散開発しようということで、さくらVPS上にgitを使った開発環境を構築しました。
その時のメモです。

前提:
・gitがインストールされていること
・リポジトリ等は、開発者用のグループでread/write/exec権限があること

①ベースとなるリポジトリを作成(簡単のため、ゆってぃのホームディレクトリ)
cd /home/yutty(ユーザ名)/git_test
git init

②みんながアクセスするリモートリポジトリ(ベアリポジトリ)の作成
cd /var/git(例)
git clone --bare /home/yutty/git_test test.git

③誰かがpushしたら、テスト用サーバーに自動でpullされるように、ベアリポジトリ上にhooks/post-receiveを追加
Qiitaに記事がありました

④テスト用WEBサーバをDigest認証に
参考サイト
httpd.confの設定は、AuthDigestFileではエラーになったので、AuthUserFileとしています。

以上です。
関連記事
頭に来る程てこづったのでメモ。

○参考サイト
迷走主義工房エーテルワークスさん
Qiita ruby2.x.xのインストール方法
Qiita sudo 経由で rbenv を使えるようにする

○ひっかかったところ
CentOS6では、yumでインストールするとrubyのパッケージは1.8.3がインストールされる。
しかし、redmineは2.0以上しかサポートしていないらしく、インストール中にエラー出た。
そこで、Qiita ruby2.x.xのインストール方法に従い2.3.0をインストール。
この時点ではgemコマンドにPATHが通っていないので、通す。
その後、gemコマンドでbundlerのインストール。
bundlerにもPATHを通す。
実行しようとしたら、root権限ではダメとか言って来たので、redmineディレクトリ以下をredmine編集権限のあるユーザーとおなじグループにした。
redmineディレクトリ以下、Gemfileがあるディレクトリ上で
bundle install --without development test postgresql sqlite
を入力。(※DBにはMySQLを使用)
そこからは迷走主義工房エーテルワークスさんのページに従って作業。

ほとんどのケースでpermissionエラーが出るので、sudo -i で乗り切ったが、ちゃんと環境変数設定しないとな。
関連記事
こんばんは。
今年もいよいよ終わりに近づいてきましたが、未だに独身のゆってぃです。

今更ながら、組み込みの世界では常識となったYoctoを記事に取り上げます。

今日やること:raspberryPi2上にYoctoでビルドしたLinuxを動作させる。
 ○開発OS:ubuntu 14.04(32bit) ※Virtual Box上で動作
 ○参考サイト:Qiita Raspberry Pi3 with Yocto Project:環境構築(※RaspberryPi3向けの記事ですが、2でも同じです)

①開発に必要なパッケージのインストール
 Yoctoの公式ページに従って、必要なパッケージをインストールします。

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat libsdl1.2-dev xterm


②pokyのダウンロード

git clone git://git.yoctoproject.org/poky -b krogoth


gitの処理が終わったら、cdコマンドでpokyディレクトリに入って下さい。

③ビルドに必要なmetaファイルの取得

git clone -b krogoth https://github.com/meta-qt5/meta-qt5.git
git clone -b krogoth git://git.openembedded.org/meta-openembedded
git clone -b krogoth git://github.com/jumpnow/meta-rpi
git clone -b master git://git.yoctoproject.org/meta-raspberrypi


④ビルドの設定

source oe-init-build-env build_rpi


これで、confディレクトリ以下にはlocal.confとbblayers.confが作られます。
ただ、これはqemu用なので、raspberrypi用に置き換える必要があります。

⑤confファイルの置き換え

cp ../meta-rpi/conf/local.conf-sample conf/local.conf
cp ../meta-rpi/conf/bblayers.conf-sample conf/bblayers.conf

bblayers.confのファイルパスは、各自の環境に応じて書き換えてください。

⑤bitbakeの実行

bitbake -k core-image-minimal


○以下、自分用メモ
・Devicetreeについて
Qiitaの記事にあった。
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク