2010/08/26(木)Netduinoにお触りしてみた

2010/08/29 06:09 netduinonucho
Netduinoとは.Net Micro Frameworkが組み込まれており、VisualC#上で開発ができるちょっとびっくりなマイコンボードです。
これによってオプジェクト指向プログラミング、デバッグ、マルチスレッド処理などができることが特徴かと思います。
またArduinoとピン互換でArduino用のシールドが使える(かもしれない)上に、3500円程度と安価
これは買うしかないということで、ひとつ購入してみました。

見た目

100829-051835.jpg

セット内容は以下のようになってます。
  • Netduino本体
  • microUSBケーブル
  • ゴム足
  • Microsoft Tag
NetduinoはmicorUSBという今のところまだ流行っていないコネクタが使用されていますが、ケーブルまで付属しているので安心ですね。
MicrosoftTagは Microsoftが考えたQRコードのような2次元バーコードらしいです。読み込むとNetduinoのサイトに飛ばされます。

セットアップ

netduinoのサイトのdownloadのところのdevelopment environmentに従って、
  1. Microsoft Visual C# Express 2010
  2. .NET Micro Framework SDK v4.1
  3. Netduino SDK v4.1.0 (32-bit) or Netduino SDK v4.1.0 (64-bit)
の順番にインストールしましょう。

セットアップやプロジェクトの作り方などの説明はやまねこのマイコン実験室というサイト様がわかりやすくまとめられていて、とても助かりました。

大人の科学マガジン付属のPOVを動かしてみた

とりあえず試してみようということで、大人の科学マガジン Vol27について来ていたPOVをnetduinoで動かしてみました。

100827-211632.jpg

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace japanino_pov
{
    public class Program
    {
        public static void Main()
        {
            // ビットマップ(画像)を定義
            byte[] bitmap = 
                new byte[] {0x00, 0x41, 0x7f, 0x41, 0x00, 0x00, 0x0e, 0x1f, 0x3f, 0x7e, 0x3f, 0x1f, 0x0e, 0x00, 0x00, 0x3f, 0x40, 0x40, 0x3f, 0x80};

            OutputPort[] led = new OutputPort[7];
            led[0] = new OutputPort(Pins.GPIO_PIN_D7, false);
            led[1] = new OutputPort(Pins.GPIO_PIN_D8, false);
            led[2] = new OutputPort(Pins.GPIO_PIN_D9, false);
            led[3] = new OutputPort(Pins.GPIO_PIN_D10, false);
            led[4] = new OutputPort(Pins.GPIO_PIN_D11, false);
            led[5] = new OutputPort(Pins.GPIO_PIN_D12, false);
            led[6] = new OutputPort(Pins.GPIO_PIN_D13, false);

            InputPort sw = new InputPort(Pins.GPIO_PIN_D6,false,Port.ResistorMode.PullUp);

            int pos = 0; //現在のビットマップ中の位置
            int i=0;
            while (true)
            {

                if (sw.Read() == false)//スイッチがオンならば一回描画
                {
                    Thread.Sleep(6);// すぐ始めると詰まって見えるのでちょっと待つ
                    pos = 0;

                    while (bitmap[++pos] != 0x80)
                    {
                        for (i = 0; i < 7; i++)
                        {
                            led[6 - i].Write(((bitmap[pos] >> i) & 0x01) == 1);
                        }
                        Thread.Sleep(1);//LEDが光っている時間
                    }
                    
                }

                for (i = 0; i < 7; i++)
                {  // 全ドット、消灯
                    led[i].Write(false);
                }
            }
        }
    }
}
芸のないことに「I♥U」と表示するスケッチをそのまま移植しただけです。
ArduinoよりもI/Oに最大流せる電流が大分少ないらしいですが、LED7つくらいなら余裕ですね。


感想

Visual Stdioでの開発に関してですが、ArduinoIDEよりもさらにPC上の開発がそのまま外部へ出てきてる感じで非常にやりやすいです。(ちょっと変な表現ですが^^;)

開発環境に関して文句はないんですが、ただ個人的にはピン数がちょっと少ないかなぁと。
Arduinoのシールドと互換性を持たせたかったのはわかるんですけれど、ピンを二列ピンヘッダにしてみるとかある程度互換性を犠牲にしてもIOを増やして欲しかったですねえ。
でもそうするとちょっとお高めになるのかな?

以上、少しお触りしてみた雑感でした。
積まずにここから何か発展させてみたいところです…。

Microsoft Tagを読んでみた

おまけでnetduinoに同梱されているMicrosoft Tagをハイブリさんで読んでみました。
タグのリーダーに関してはここからWindowsPhone用のものをインストールして使いました。

インストールしてアプリを実行したところです。
20100829053845.jpg

オートフォーカスが使えないため常にブレっぱなしです。これでは読めっこないですね。
また、機種依存でしょうが表示されているカメラ画像が反時計回りに90度ずれていて、左に動かすと画面が下に、下に動かすと画面が右にというように動きます。
慣れない動きでかなりの脳トレになりそうですが、使う上では単なるストレスですので何とかして欲しいところですね…。

と、何だかんだ文句を言いましたが「Menu→Setting→Use Snap Mode」にチェックを入れることで、普段使っているカメラアプリで写真を取り込むことが出来ます。これを使えばOKです。

Tagを中心に合わせて読み込んだら無事以下のように飛ばされました。
20100829054259.jpg


うーん、MicrosoftTagは流行るんでしょうかねえ。
それでも他の環境のアプリはもう少し使い安いのかな…。

2010/08/26(木)Netduinoにお触りしてみた

2010/08/29 06:09 netduinoimportnucho
Netduinoとは.Net Micro Frameworkが組み込まれており、VisualC#上で開発ができるちょっとびっくりなマイコンボードです。
これによってオプジェクト指向プログラミング、デバッグ、マルチスレッド処理などができることが特徴かと思います。
またArduinoとピン互換でArduino用のシールドが使える(かもしれない)上に、3500円程度と安価
これは買うしかないということで、ひとつ購入してみました。

見た目

100829-051835.jpg

セット内容は以下のようになってます。
  • Netduino本体
  • microUSBケーブル
  • ゴム足
  • Microsoft Tag
NetduinoはmicorUSBという今のところまだ流行っていないコネクタが使用されていますが、ケーブルまで付属しているので安心ですね。
MicrosoftTagは Microsoftが考えたQRコードのような2次元バーコードらしいです。読み込むとNetduinoのサイトに飛ばされます。

セットアップ

netduinoのサイトのdownloadのところのdevelopment environmentに従って、
  1. Microsoft Visual C# Express 2010
  2. .NET Micro Framework SDK v4.1
  3. Netduino SDK v4.1.0 (32-bit) or Netduino SDK v4.1.0 (64-bit)
の順番にインストールしましょう。

セットアップやプロジェクトの作り方などの説明はやまねこのマイコン実験室というサイト様がわかりやすくまとめられていて、とても助かりました。

大人の科学マガジン付属のPOVを動かしてみた

とりあえず試してみようということで、大人の科学マガジン Vol27について来ていたPOVをnetduinoで動かしてみました。

100827-211632.jpg

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace japanino_pov
{
    public class Program
    {
        public static void Main()
        {
            // ビットマップ(画像)を定義
            byte[] bitmap = 
                new byte[] {0x00, 0x41, 0x7f, 0x41, 0x00, 0x00, 0x0e, 0x1f, 0x3f, 0x7e, 0x3f, 0x1f, 0x0e, 0x00, 0x00, 0x3f, 0x40, 0x40, 0x3f, 0x80};

            OutputPort[] led = new OutputPort[7];
            led[0] = new OutputPort(Pins.GPIO_PIN_D7, false);
            led[1] = new OutputPort(Pins.GPIO_PIN_D8, false);
            led[2] = new OutputPort(Pins.GPIO_PIN_D9, false);
            led[3] = new OutputPort(Pins.GPIO_PIN_D10, false);
            led[4] = new OutputPort(Pins.GPIO_PIN_D11, false);
            led[5] = new OutputPort(Pins.GPIO_PIN_D12, false);
            led[6] = new OutputPort(Pins.GPIO_PIN_D13, false);

            InputPort sw = new InputPort(Pins.GPIO_PIN_D6,false,Port.ResistorMode.PullUp);

            int pos = 0; //現在のビットマップ中の位置
            int i=0;
            while (true)
            {

                if (sw.Read() == false)//スイッチがオンならば一回描画
                {
                    Thread.Sleep(6);// すぐ始めると詰まって見えるのでちょっと待つ
                    pos = 0;

                    while (bitmap[++pos] != 0x80)
                    {
                        for (i = 0; i < 7; i++)
                        {
                            led[6 - i].Write(((bitmap[pos] >> i) & 0x01) == 1);
                        }
                        Thread.Sleep(1);//LEDが光っている時間
                    }
                    
                }

                for (i = 0; i < 7; i++)
                {  // 全ドット、消灯
                    led[i].Write(false);
                }
            }
        }
    }
}
芸のないことに「I♥U」と表示するスケッチをそのまま移植しただけです。
ArduinoよりもI/Oに最大流せる電流が大分少ないらしいですが、LED7つくらいなら余裕ですね。


感想

Visual Stdioでの開発に関してですが、ArduinoIDEよりもさらにPC上の開発がそのまま外部へ出てきてる感じで非常にやりやすいです。(ちょっと変な表現ですが^^;)

開発環境に関して文句はないんですが、ただ個人的にはピン数がちょっと少ないかなぁと。
Arduinoのシールドと互換性を持たせたかったのはわかるんですけれど、ピンを二列ピンヘッダにしてみるとかある程度互換性を犠牲にしてもIOを増やして欲しかったですねえ。
でもそうするとちょっとお高めになるのかな?

以上、少しお触りしてみた雑感でした。
積まずにここから何か発展させてみたいところです…。

Microsoft Tagを読んでみた

おまけでnetduinoに同梱されているMicrosoft Tagをハイブリさんで読んでみました。
タグのリーダーに関してはここからWindowsPhone用のものをインストールして使いました。

インストールしてアプリを実行したところです。
20100829053845.jpg

オートフォーカスが使えないため常にブレっぱなしです。これでは読めっこないですね。
また、機種依存でしょうが表示されているカメラ画像が反時計回りに90度ずれていて、左に動かすと画面が下に、下に動かすと画面が右にというように動きます。
慣れない動きでかなりの脳トレになりそうですが、使う上では単なるストレスですので何とかして欲しいところですね…。

と、何だかんだ文句を言いましたが「Menu→Setting→Use Snap Mode」にチェックを入れることで、普段使っているカメラアプリで写真を取り込むことが出来ます。これを使えばOKです。

Tagを中心に合わせて読み込んだら無事以下のように飛ばされました。
20100829054259.jpg


うーん、MicrosoftTagは流行るんでしょうかねえ。
それでも他の環境のアプリはもう少し使い安いのかな…。

2010/08/17(火)mbedでロータリーエンコーダを読んでみた

2010/08/18 05:53 mbednucho
mbedのCookbookを覗いていたら、QEIライブラリというものを見かけました。
このライブラリはロータリーエンコーダのパルス数を数えるためのものなようです。
ロータリーエンコーダは使う予定があるので、試しに使ってみました。

ロータリーエンコーダとは

 ロータリーエンコーダとは回転量を測定するために使われるセンサです。安価で扱いが簡単なインクリメンタル式と高価なアブソリュート式の二種類があり、今回扱うものはインクリメンタル式の方です。*1
 インクリメンタル式のロータリーエンコーダは軸が一定量回転するごとに位相がずれたA相とB相のパルスを出力します。A相とB相は回転方向によって出力タイミングが逆の関係になるため、どちらの方向へどれだけ回っているのかということを計測することができるわけですね。
 また、A相、B相の立ち上がり立下りから1周期分のパルス出力で4個の分解能を取ることができるため、エンコーダ分解能は出力パルスの4倍ということになります。
つまり、360度回転する間に24パルス出力するロータリーエンコーダであれば
360[deg] / (24[pulse]*4) = 3.75[deg]
の分解能があると計算できます。

rotaryencorder_pulse.png


*1 : 延々周り続ける電子レンジのつまみとかは確かこれです

QEIライブラリを使ってみる

QEIはQuadrature Encoder Interfaceの略でインクリメンタル式のロータリーエンコーダを読むためのライブラリです。
今回はとりあえず手元にあった秋月で200円で売っているエンコーダの出力パルス数を計測し、キャラクタLCDに表示するものを作ってみました。
100818-051809.jpg

回路図

RotaryEncorder_test.PNG

プログラム

QEI_test
#include "QEI.h"
#include "TextLCD.h"


TextLCD lcd(p5, p6, p11, p12, p13, p14); // rs, e, d0-d3
Serial pc(USBTX, USBRX);

#define ROTATE_PER_REVOLUTIONS  24
//Use X4 encoding.
QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING);
//Use X2 encoding by default.
//QEI wheel (p30, p29, NC, 624);

int main() {
    while(1){
        wait(0.1);
        lcd.printf("Pulses: %07d\n", wheel.getPulses());
        lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4));
    }
}


それでは要点の説明です。
#define ROTATE_PER_REVOLUTIONS  24
//Use X4 encoding.
QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING);
QEIのインスタンスを生成しています。
第一、第二引数にA相のピン、B相のピンを設定します。
第三引数はオプションで回転数を数えるピンがあればそれを設定するようです。
第四引数はロータリーエンコーダが一回転あたり何パルス出力するかを設定しています。*2
第五引数はモードを設定しています。X4_ENCODINGモードであればロータリーエンコーダの分解能を完全に使って1パルス出力で4カウント増加します。X2_ENCODINGモードであれば、ロータリーエンコーダの分解能を半分にして1パルス出力で2カウント増加します。おそらくX2_ENCODINGモードにすると周波数が高い時に取りこぼしが少なくなると考えられるので、分解能があまり必要でなく精度が必要な場合はこちらを使うという風に使い分けるのだと思います。


        lcd.printf("Pulses: %07d\n", wheel.getPulses());
        lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4));
キャラクタLCDに出力しています。
1行目ではwheel.getPulses()メソッドによって初期状態から現在のどちら方向にどのくらい回ったかというのを取得しています。
2行目では軸が何回転したかというのを計算して表示しています。

*2 : でも内部では使用されてなくて、何のために設定しているかちょっとよくわかりません…^^;。

終わりに

機械接点式のロータリーエンコーダであるため、チャタリングというノイズがのり速く回したりするとどんどん実際の回転数とズレが出てきてしまいますね。X2_ENCODINGモードだとちょっとましになるのかな…?

準備が出来たら次はこのモータで計測を行ってみたいと思ってます。

参考

ロータリーエンコーダを使う

2010/07/12(月)100円均一の商品から昇圧回路を作ってみた

2010/07/13 01:48 電子工作importnucho
100円シガーライターソケット用DC-DCダウンコンバータをアップコンバータに改造しよう!
こちらのサイトで、キャンドゥという100円ショップで売られているCAR CHARGERという商品にはMC34063というDCDCコンバータICが入っているということを知りました。
商品自体は12Vから5.5Vを作る降圧回路ですが、このICは部品を流用して簡単に昇圧回路にできるようです。
100円均一で昇圧回路の部品が一通り手に入るのだから、面白い話ですね。

今回、近所で運よくCAR CHARGERを見つけることができた*1ので、先日使用した液晶のバックライトを光らせる*2ことを目的として、昇圧回路の製作を行ってみました。

*1 : 最初車コーナーを探したのですが見つからず、電池コーナーで発見しました

*2 : 現在は昇圧回路付きのボードが発売されていますが、短期間に同じ通販サイトを利用するのは何だか癪です…

分解

100712-210749.jpg
 
100712-211038.jpg

CAR CHARGERはこんな形の商品です。
シガーライタに挿す部分をくるくる回して、簡単に分解できます。

100712-211241.jpg
100712-211532.jpg

ねじ止めもないので、基板もすぐ取り出すことができました。
部品が何故か凄く汚れていますね。製造過程で何があったんでしょうか…。

解析

ちなみに元の回路を追ってみるとこんな回路図でした。

部品の番号は基板のシルク印刷に従ったつもりです。
当たり前ですが、データシートのステップダウンコンバータと同じ回路ですね。

データシートと照らし合わせると、電流制限設定はIpk=0.3/R2
出力電圧設定はVout=1.25*(1+ (R4/R3))
で値が得られることがわかります。

なので、この回路では
電流制限設定は0.3/0.5 = 600mA
出力電圧設定は1.25*(1+(3000/820))≒5.82V
となっています。出力電圧が若干大きいような気がしますね…。

昇圧回路にしてみる

それでは、昇圧回路に作り直してみます。
部品をすべて外し、以下のような回路図でユニバーサル基板に付け直しました。
carcharger_stepup.PNG
 
100712-211624.jpg

データシート及び参考にしたサイト様とほとんど同じ回路です(^^;

お気軽に部品を使いまわすことを優先し、推奨の値はあんまり気にしていません
具体的には部品は3kΩ抵抗以外は流用し、Idrvに接続する220Ω*3と出力電圧設定の10kΩの可変抵抗だけ付け足しました。
出力電圧設定をこのようにすることで、3.3Vを入力した場合は3.3V~16.5V程度まで昇圧できます。

*3 : 本当は180Ωが推奨値っぽいですが、220Ωしか手元になかったもので…

動いた

100712-221908.jpg

ぴかーん。
可変抵抗を調節することで3.3Vから8Vを出力させ、無事にバックライトを光らせることができました。

2010/07/09(金)NokiaLCDライブラリでNOKIA3300-LCDが動いた

2010/07/10 01:33 mbednucho
NOKIA3300-LCDとはaitendoさんで販売されている128*128pixels、4096色のカラー液晶です。
mbedのNokiaLCDライブラリで使われている液晶と、コントロ-ラICが一緒だったので使えないかと思って試してみたところ、コマンドをほんの少しだけ設定し直すことで使うことが出来るようになりました。

NOKIA3300-LCDは単品だと500円ですし、キャリーボード付きでも1500円程度なので、簡単に動かせるとなると結構嬉しいですね。

動かしたところ

Nokia3300.jpg

回路図はCookbookに載っているまんまです。
昇圧回路がないので、バックライトが点けられていません…。

プログラム

NokiaLCDをそのまま使用すると、表示位置と色が反転してしまいます。そこで、
Nokia6100 液晶って130x130なんですけど – Sim's blog
こちらの記事を参考にDATCTLコマンドのパラメータを適切にすることで解決できました。

具体的にはNokia6600用の設定の
            command(0xBC);
            data(0);
            data(1);
            data(4);
の部分をNokia3300用に
            command(0xBC);
            data(1);
            data(0);
            data(4);
とだけ書き換えることで正常に表示されるようになりました。
データシートではP37を見ると少し詳細が書いてあります。

NokiaLCDライブラリにNOKIA3300-LCD用の設定を追加したプログラムを以下にあげておきます。
NokiaLCD_AddNOKIA3300