mechatronics / robotics
Blog
  • HOME »
  • Blog »
  • 電子工作

電子工作

LCDディスプレイNokia5110テスト

OLEDディスプレイに続いて液晶ディスプレイNokia5110を使ってみました。SPIなので表示は速いですが、OLEDと比較してしまうと画質の悪さが目立ちます。また、全体の大きさに比べて実描画エリアが狭いのはNGです。バックライトも付きますがちょっと品位がないというか。プログラムはOLEDの時のものをほぼ流用してSPIのところを書き換えました。コントロールはI2Cのものに比べて簡単です。

OLEDディスプレイ(SSD1306)テスト

0.96インチ、128X64ドットのOLEDディスプレイの描画テストをArduinoを用いてテストしました。2cm程度の非常に小さいものなので、もともと数字等を静的に表示するための製品かとは思います。 配線は簡単で、電源とI2Cをつなぐだけです。ソフトのほうも通常はAdafruit社のライブラリを使えばよいでしょう。今回はデータシートを見て自前で書いてみました。 データシート SSD1306イニシャライズ I2CはArduinoのWireを使います。 I2Cの通信の仕様に関してはデータシートのP20 I2C-bus Write dataに説明があります。デバイスのアドレスは基板の裏側の抵抗の位置によって2通りあるようです。このアドレスを1bit左にずらして末尾にR/Wの0をつけて(私の場合は0x3C)を最初に送信します。これに続けて諸々を送信するのですが、これはデータシートの最後についているApplication noteのP5に沿ってやっています。 各コマンドはデータシートのP28~に記載されていて、上のコードでは2列目(Wire.write(0xAE) など)となります。1列目の0x80、0x00はコマンドに先立って送るControl byteといわれているもので、P20に説明がありますがわかりにくいです。0x80なら続けて1個0x00なら続けて複数個が送られる、と解釈しました。 Application noteにないコマンドで追加で送っているのは17-19行目の0x20,0x21,0x22です。この辺の説明はP34-36にあります。Horizontal addressing modeというものに設定していて、全画面の画素データを連続で送れるというものです。画面の成り立ちはP25に図があります。縦方向がpage、横方向がsegmentで分割されていて、1pageの縦は8bit(1byte)でこれを単位にアクセスします。 画素へのアクセス buf[]はすべての画素のデータを保持しておくための配列です。描画の計算はいつもこのbufに対して行い、最後にまとめてデバイスに転送します。 一つの点(ピクセル)を描く関数です。直線や円を描くときもここにやってきます。pos_negはその画素を点灯するか消灯するかを表します。bufの該当部分(1 byte)にORで書き込みます。縦方向の座標yがsegmentの中の何ビット目なのかを計算しているのが(1

mBotでROSを試す

最近、自動運転等にも利用されているというROS(Robot Operating System)に興味を持ちました。とりあえず「ROSではじめるロボットプログラミング」(工学者)を読んでなんとなく理解しましたので、リアルロボットでちょこっと試してみました。 使用したロボットはmBot(Makeblock)というArduinoベースの教育用STEMロボットです。1年ほど前に購入して30分くらい動かしてそのまま放置していたもので、その再利用です。 ROSはUbuntu16.04をインストールしたRaspberryPi3に載せ、Arduino(mBot)との間で”rosserial”という仕組みを使ってシリアル通信します。RaspiはパソコンからSSH接続できるようにしておきます。ROS側からのコマンドでロボットの前進・後進、ロボットに付属の照度センサの入力で一時停止させるような動作を実現させます。 ・mBot(Arduino)側 Arduinoに書き込むプログラムは具体的にモーター駆動やセンサー読み取りを行なうデバイスドライバのような位置づけかと思います。 mBotには簡単にモーターやセンサーを扱えるライブラリがあるのですが、これを使うとArduinoのRAMの容量が足りなくなってしまいましたので、ここでは普通のanalogReadやanalogWriteを用いています。またROSには並進・回転速度をまとめて扱えるTwistというメッセージがありますが、今回はこの中の並進速度(linear.x)のみを使っています。 次はROS側のpythonスクリプトです。 ・vel_publisher.py whileループの中でキーボード入力があれば、ロボット速度をpublishします。一方subscriberはcallback関数の中で照度センサの値を読み込み、照度が低ければ(手でセンサを押さえた)速度ゼロを、照度が高ければ(普通の明るさ)現状速度をpublishします。 ・動作確認 mBotからRaspiに電源供給できなかったので、外部からRaspiにUSB電源接続しています。

BLEモジュール RN4020を試す

簡単にBLEを使えるモジュールとしてmbed HRM1017やBlendMicroがありますが、値段がお高いので躊躇してしまいます。microchipのRN4020はマイコンが付かない代わりに値段が8ドル程度とお安くなっています。低価格の8ビットマイコン等と組み合わせれば千数百円で同等の機能が実現できてしまいます。今回は手元にあったmbedと繋いでiPhoneとのBLE通信をテストしてみました。 RN4020は側面に端子が出ていますので細いワイヤーなら直にはんだ付けできます。結線は、  RN4020 – mbed ・vcc——3.3V ・gnd——gnd ・rx——-tx(p28) ・tx——-rx(p27) ・wake_hw–p5 ・cmd/mldp-p6 ・wake_sw–p7 ・rts   |  cts (追記) となります。wake_hw, cmd/mldpはGND、wale_swはVCCでも可です。 Service UUIDとCharacteristic UUID(2個)を用意します。Characteristic UUIDはRead/Notify用とWrite用です。 Readは、モジュール側でCharacteristicにwriteしたものをiPhoneがReadしに来ます。Notifyはモジュール側でCharacteristicにwriteしそれをiPhoneにNotifyします。WriteはiPhoneがモジュールのCharacteristicにwriteしてそれをモジュール側で読み出します。ReadとWriteの主語はiPhoneで、Notifyの主語はモジュールです。 はじめにマイコンからモジュールにコマンドを送って設定を行ないます。 “S-,RN4020\r” //名前を設定 “SR,20006000\r” //フィーチャー設定 Auto Advertise & iOS Mode & Server Only “SS,80000001\r” //サービス設定 Device Information & User Defined Private Service “ST,0010,0002,0064\r” //コネクションパラメータ iOS用の設定 “PZ\r” //Private Serviceの設定をクリア “PS, suuid\r” //Private ServiceのUUIDを設定 “PC, cuuid0,12,01\r” //Private CharacteristicのUUIDを設定 Read/Notify “PC, cuuid1,08,01\r” //Private CharacteristicのUUIDを設定 Write “R,1\r” //Reboot データの読み出しはiPhoneからWrite用のCharacteristicに書き込まれたものをread_characteristic関数内で”SUR,cuuid1\r”を使って読み出します。16進数の文字列で来るので1byteのデータでも2回読み出します。サンプルコードでは受け取ったデータの下4桁をLEDに表示しています。 iPhoneに送るデータはwrite_characteristic関数内で”SUW,cuuid0,data\r”を使って書き込みます。この場合もデータは2桁の16進文字列に変換します。PCコマンドでNotifyを設定しているので自動的にiPhone側に通知されます。1秒ごとの割り込みで0〜255のデータをwriteしています。 iPhone側はLightBlueというアプリで確認できます。

BLEND MICROを試す

iPhoneからBLEで自作機器をコントロールする案件で、MBED HRM1017が売り切れで入手できなかったので代わりとなるものを探したところBlend Microなるものを見つけました。Arduino互換のBLE受信器付きマイコンボードです。マイコンはATMega32U4で3.3V/8MHz駆動となります。 ポートはD0〜D13(D4,6,7を除く)、A0〜A5、SPIが使えます。BLEの通信は、ble_write(‘a’)、ble_read()みたいな感じで何も考えずに使うことができます。 開発環境としてCodeBenderというmbed風のオンラインIDEが提供されていて、こちらもなかなか快適です。コンパイルや基板へのダウンロードは本家のIDEよりもかなり速い印象です。 ただし重大な欠点がひとつあって、コンパイル(ベリファイ)してもソースコードファイルが保存されません。他の開発環境はだいたいcompile==saveになっているので、ついつい保存しないまま終了してしまいすべて失うというミスを何度か冒しました。 ***サンプル*** ・BlendMicro側 ・iPhone側 書籍「iOSxBLE CoreBluetoothプログラミング」を参考にしました。 viewController.h viewController.m

LPC11U35 WAVE再生でノイズ発生

SDカードのWAVE音声をPWMで出力する、というのをLPC11U35でmbedの開発システムを利用して行いました。音声は8bit/16k/monoです。PWMは192kHzで、16kのひとコマに12周期はいる感じです。mbedで同様のことをやっている例がたくさんありましたのですんなりできると思ったのですが、結果として盛大なノイズがでてしまいました。いわゆるヒスノイズのようなものではなくブツブツという明らかに異常なノイズです。 オシロで観察したところ、たまにPWMの波形が間延びしているところがあってこれがノイズになっているようでした。調べたところ、LPC11U35にはPWMのマッチレジスタにシャドーレジスタというものがなく、デューティを書き換えるタイミングによってはH->Lの切り替えを逃してしまい1区間フラットな信号がでてしまうのが原因とのことでした。今までそんなことは気にしたこともなかったのですがたまたま「良い」マイコンを使っていたのかもしれません。 対策としてデューティ書き換え時にPWMのカウンタをチェックして0にリセットされるのを待ってから書き換えるように変更しました。一応これで音はきれいになりました。 それと、音声用とは別にTickerの割り込みを使っていたのですが、この対策を入れた途端になぜか割り込みがまったくかからなくなりました。試行錯誤の末、2つの割り込みのタイミングを調整して長いほうを短いほうの定数倍の数値にするとどういうわけかちゃんと動くようになりました。

Raspberry Piで遠隔カメラ(2)

iPhone側のプログラムです。やっていることは、 ・web viewにRaspberry PiのIPアドレスを設定してカメラのストリーミング画像を表示 ・CMMotionManagerでiPhoneの姿勢(Pitch/Yaw)を取得してカメラ(サーボ)角度を計算しRasPiにサーボの制御を依頼 ・UIButtonのタッチを検知してRasPiにGPIOの制御を依頼 となります。 RasPiへの制御依頼には、stringByEvaluatingJavaScriptFromStringを使います。これでRasPi側のJavascript内の関数が実行されます。

Raspberry Piで遠隔カメラ

Raspberry Piを使って遠隔映像監視の実験をしました。当初ネットの情報をあさったのですが、以前購入した「Raspberry Piで学ぶ電子工作」の書籍をぱらぱらとめくっているとほぼそのままの例が載っていることに気づきました。今回はこちらを参考に、スマホ(iPhone)からのコントロール部分をスマホの姿勢センサーを使うように変更してみました。 ちなみにこの「Raspberry Piで学ぶ電子工作」はRaspberry Piの入門書として大変おすすめです。技術解説書なのにブルーバックスということでどうなのか?と最初は感じましたが、中身は非常にツボを押さえた説明でわかりやすくなっています。ひとにものを教えるコツを知っている方が書いているなあという印象です。 さて下記は今回使用した部品(機材)のリストです。全部そろえると結構なお値段になります。 ・Raspberry Pi B+ ・R-Pi Camera module ・Panasonic モバイルバッテリー QE-QL201-W ・BUFFALO USB2.0ハブ BSH4A01BK ・BUFFALO 無線LANドングル WLI-UC-GNM2 ・カモン USB→DC(外径3.5mm内径1.3mm)電源供給ケーブル ・マイクロサーボ SG90 x2 ・BUFFALO 無線LAN親機 WMR-300/S (Optional) ・サインスマート 4チャンネル 5V リレーモジュール (Optional) スマホの動きに連動してカメラが上下左右に動くような仕様にしたためサーボは2個使います。サーボ用のPWM信号はGPIO18のみで出力可能と書かれているところが多いのですが、GPIO13からも出力することができます。 無線LAN親機は家庭の無線LANが届かない屋外で実験するときに必要です。最後のリレーモジュールは普通は不要です。今回、移動用の台車(ロボット)を間接的にスイッチをON/Offして動かすことになったために使ったものです。タミヤのラジコンキットなどを使う場合には書籍にあるようにモータードライバを接続します。 サーボの駆動電源はUSBハブから供給しています。 RasPi用のプログラムは書籍の追加情報サイトからダウンロードしたものを流用します。書籍ではコントロールはブラウザ上ですべて行うようになっています。これですとスマホの姿勢センサによる操縦ができませんので、ブラウザは映像を映すのみとし操縦はスマホアプリのボタン等から行うように変更します。以下にサンプルプログラムを変更する部分を示します。 ・index.html スライダーと説明の文字を削除します。 ・javascript.js ブラウザのイベントリスナーをコメントアウト 画面に操縦用の矢印を描かないようにする。 スマホから呼び出す関数2つを追加。 ・script.py servo_minとservo_maxは使用するサーボの特性にあわせて変更します。また追加のサーボ用にGPIO13も出力に設定します。 この部分はリレー用のGPIOの設定です。書籍と同じようにモータードライバを使う場合は変更不要です。 サーボにPWMを送る関数とGPIOをON/Offする関数を追記します。 次回iPhone側のプログラムについて書く予定です。

PIC18F14K50で状態変化割り込み

秋月電子で見つけたPIC18F14K50搭載の小型マイコンボードを小さなメカに組み込もうと思いまして、赤外リモコン受信用に状態変化割り込み(interrupt on change)を使おうとしたのですが、なかなかうまくいかず手こずってしまいました。 とりあえず動いたコードを載せておきます。MPLABX/XC8環境です。

シフトレジスタでマトリクスLEDを表示

シフトレジスタ(74HC595)2個を使って5×7ドットマトリクスLEDの表示を行ないました。マイコンからの配線が3本で済むのが利点です。74595のQ7Sという端子を次の素子の入力につなぐことで(図の短い黄色線)データを次々に押し出していくことができますので、8bit以上のパラ出力も可能です。 使用したLEDはMOA20UB019GJという型番のものです。列側が電源、行側がグランドになりますのでそのように出力します。列側の5本に抵抗をいれていますので、明るさがムラにならないように行ごとに出力します。8行めのデータはダミーです。シフトレジスタが8桁なのでそれに合わせています。最初のkのforループで生成したデータは次のforループのときに押し出されて後段の74HC595に入っていきます。

Page 1 / 212
PAGETOP
Copyright © Meuse Robotics All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.