趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • 秋月のLPC11U35マイコンボードを動かしてみた

    投稿日 2017年 7月 10日 コメントはありません

    久しぶりに秋月へ行ったら、「USBメモリにファイルを書き込むのとほぼ同様の手軽さでプログラムを書き込むことができます」という触れ込みのマイコンボードが安く売っていたので、買ってみました。

    で、動かしてみるべく、Linuxマシン(環境はいつものLinux Mintです)へ接続すると、確かにマスストレージデバイスとして認識します。で、秋月のWebサイトにある動作確認用ファームウェアを書き込んで、リセットしてみても、再びマスストレージデバイスとして認識されて、LEDが点滅する気配がありません。

    mbedとしても動作する、というのでサンプルプログラムを作って同様に書き込んでみてもサッパリです。linuxではドラッグアンドドロップでの書き込みはうまく行かないのかと思って、コマンドラインで cp コマンドでコピーしてみてもダメです。

    で、ぐぐってみたら、どうやら linux ではそもそもファイル書き込みではうまくいかないようで、こちらの情報によると先頭の4ブロック(2キロバイト?)を削ってddで書き込むとうまく行くようです。

    ただ、デバイスファイルなんていろんな要因で変わってしまうので、毎回やるのは面倒ですし、事故のもとなので、pythonのスクリプト化しました。

    lsblkコマンドで見た時に、転送方法が usb で、モデルが’LPC1XXX IFLASH  ‘となっているデバイスファイルを探して、そのデバイスファイルをアンマウントして、ddコマンドで書き込むだけです。スクリプトファイル⇒mbedにlinuxから書き込むためのスクリプト

    ルート権限が必要なのは変わらないので、sudo 付きで python スクリプトを実行します。

    $ sudo python ./write_mbed.py firmware.bin 
    mbed device is /dev/sdc
    umount /dev/sdc
    dd if=firmware.bin of=/dev/sdc seek=4
    16+1 レコード入力
    16+1 レコード出力
    8456 bytes (8.5 kB, 8.3 KiB) copied, 0.387457 s, 21.8 kB/s

    みたいな感じで使います。(途中の umount とか dd コマンドの行はこのスクリプトの処理内容を表示しているだけで、書き込みに必要な操作は最初の1行目だけです)

     


  • STM32F401で遊んでみる(5)

    投稿日 2015年 1月 6日 コメントはありません

    9.printf()やgetc()を使ってみる

    mbedを挿入した際のログをdmesgコマンドでみてみました。

    [15886.601036] usb 2-1.4.3: USB disconnect, device number 9
    [15888.075962] usb 2-1.4.3: new full-speed USB device number 10 using ehci_hcd
    [15888.225240] scsi7 : usb-storage 2-1.4.3:1.1
    [15888.225648] cdc_acm 2-1.4.3:1.2: This device cannot do calls on its own. It is not a modem.
    [15888.225670] cdc_acm 2-1.4.3:1.2: ttyACM0: USB ACM device
    [15889.223047] scsi 7:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
    [15889.224257] sd 7:0:0:0: Attached scsi generic sg2 type 0
    [15889.226709] sd 7:0:0:0: [sdb] 1072 512-byte logical blocks: (548 kB/536 KiB)
    [15889.227459] sd 7:0:0:0: [sdb] Write Protect is off
    [15889.227464] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
    [15889.227958] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.227963] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.230723] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.230728] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.235618]  sdb:
    [15889.237988] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.237993] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.237996] sd 7:0:0:0: [sdb] Attached SCSI removable disk
    
    

    よくみると、USBストレージだけではなく、ttyACM0というデバイスが追加されていることがわかります。

    調べてみると、Serialクラスでprintf()やgetc()などが使えそうです。プログラムの方は、

    #include "mbed.h"
    
    Serial pc(USBTX,USBRX);
    DigitalOut myled(PA_5);
    DigitalIn button(USER_BUTTON);
    
    int main() {
        int c=200;
        char k;
        pc.baud(115200);
        pc.printf("This is TEST!!\r\n");
        while(1) {
            if(pc.readable()){
                k = pc.getc();
                if((k=='a') && c<1000) c+=50;
                if((k=='z') && c>100) c-=50;
                pc.printf("Value of c: %d\r\n",c);
            }
            if(button){
                myled = 1; // LED is ON
                wait((double)c/2.0/1000);
                myled = 0; // LED is OFF
                wait((double)c/2.0/1000);
            } else {
                pc.printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
            }
        }
    }
    
    

    としてみました。内容は、

    • シリアルコンソールを115.2kbpsで開いて、メッセージを出力します。
    • 読み出せるキャラクタがあるかreadable()で確認
      (これをやらないとgetc()はキーが押されるまで動作をブロックします)
    • 読み出せる場合にはgetc()で読み出し
    • 入力文字を判別してcの値を増減
      (キーの値が読めているか確認するため)
    • ボード上のUSERスイッチが押されていない場合はcの値に応じてLEDを点滅
    • ボード上のUSERスイッチが押されている場合には文字を多数出力
      (本当に115.2kbpsでているか確認したいため)

    としています。

    プログラムを作成したらコンソールを一つ開いて、

    $ screen /dev/ttyACM0 115200

    としてシリアルコンソールを115.2kbpsで開きます。

    その後、compile(と書き込み)を行って動作を確認しました。


  • STM32F401で遊んでみる(4)

    投稿日 2015年 1月 5日 コメントはありません

    7.ソースコードをさらに改変してみる

    そのままIDEのウインドウを閉じてしまっても、IDEの左側の「Programu Workspace」の中の「My Programs」の中にツリー状に残るようです。

    こんどは別のテストをしてみるため、importしなおしてみましたが、この時にプロジェクト名も変更してみました。そうすると、「My Programs」の中にもう1つツリーができました。

    次の変更はボード上のボタンを使ってみます。ポート割り当ては、「USER_BUTTON」と「PC_13」のようなので、まずは「USER_BUTTON」でやってみます。

    修正後のソースは

    #include "mbed.h"
    
    DigitalOut myled(PA_5);
    DigitalIn button(USER_BUTTON);
    
    int main() {
        while(1) {
            if(button){
                myled = 1; // LED is ON
                wait(0.2); // 200 ms
                myled = 0; // LED is OFF
                wait(0.2); // 200 ms
            } else {
                myled = 1; // LED is ON
                wait(0.05); // 50 ms
                myled = 0; // LED is OFF
                wait(0.05); // 50 ms
            }
        }
    }

    としてみました。

    これでコンパイルすると・・・ボタンを押すと点滅が高速になりました。

    8.ここまでのまとめ

    書くと長いですが、わかってしまえば実際の作業はあっという間です。
    特に何よりもありがたいのは開発環境のインストールが必要ないことです。これでどこでも開発ができてしまいます。

    一方で、実際に触ってみたmbed環境はIDEこそ本格的な開発環境の雰囲気ですがライブラリ等まで考えて見てみるとArduinoを強く意識しているように見えます。
    より本格的な開発環境もWeb上で完結してしまうと楽ちんでいいですね。


  • STM32F401で遊んでみる(3)

    投稿日 2015年 1月 4日 コメントはありません

    5.サンプルプログラムを実行してみた

    IDE上の「Compile」をクリックしてみるとバイナリが生成されるようで、binファイルの保存場所を聞いてきます。
    ここでは、直接USBマスストレージに見えている場所(/media/NUCLEO)を指定してみました。これで勝手にターゲットボード側にプログラムが書き込まれるようで、書き込み中はデバッガ側のLEDが赤と緑に何度かチラチラ変わるようです。

    指定すると、緑LEDの点滅は止まり、赤LEDが点灯するのみになってしまいました。

    6.ソースコードを修正する

    ワークスペース左側のツリーの中から main.cpp をクリックすると、ソースが表示されました。ソースコードによれば、LED1が200ms点灯、1s消灯の繰り返しになりそうな感じです・・・が、実際にはそのようには動いていません。

    ボードのユーザーマニュアルにある回路図を見ると、

    • ターゲットボード上の赤LED(LD3)は電源供給で点灯
    • ターゲットボード上の緑LED(LD2)はJP6を介してArduinoコネクタの10pin幅の方の6pin(D13)へ接続

    となっています。一方で、端子一覧でも

    • LED1はD13と同じPA_5に割り当て

    となっているので、これでLEDは点灯してもおかしくないはずです。

    そこで、LED1の定義が怪しいと睨んで探してみたのですがみつかりません。そこで試しにソースコードの3行目の

    DigitalOut myled(LED1);

    をもっともCPU自体のポート割り当て記述に近いと思われる

    DigitalOut myled(PA_5);

    と書き換えてコンパイルしなおしてみたところ、無事にLチカが始まりました!


  • STM32F401で遊んでみる(2)

    投稿日 2015年 1月 2日 コメントはありません

    3.ファームウェアのアップデート・・・はパスする

    「ST Nucleo F401RE」のページの真ん中あたりに、「ST-LINK/V2-1 Firmware」という見出しの段落があります。そこをみると、「Firmware update required」という記載になっているので、デバッガのファームウェアアップデートが必要なことがわかります。

    その説明の中のリンクをクリックしてファームウェアをアップデートしてみます・・・・が、アップデートにあたってはWindows環境が必要なようです。
    (ドライバをインストールして、exeファイルを実行しろ、ということみたいです)

    ・・・・後ほどやってみることにします。

    4.サンプルプログラムを確認してみる

    自分のアカウント名が右上に表示されていますので、そこをクリックすると自分のホーム画面に遷移するようです。
    その画面の右側に自分が所有するボードが「(ユーザ名)’s Platforms」として表示されるので、これをクリックします。
    するとボードの仕様などの一覧と、右側に「Example programs」としてサンプルプログラムが表示されます。

    この中から、「nucleo_blink_led」をクリックしてみます。
    ソースコードは「main.cpp」と「mbed.bld」の2つのファイルからなるようです。(クリックすれば中身が見えます)

    右側に「Import this program」というボタンがありますので、これを押してみると、IDE(統合開発環境)っぽい画面のタブが追加されます。プロジェクトをImportする際の名前を聞いてきますが、デフォルトで名前が入っているのでそのまま「Import」を押してみます。

    自分のワークスペースにソースコードが取り込まれたようです。

    Screenshot-1


  • STM32F401で遊んでみる(1)

    投稿日 2015年 1月 1日 コメントはありません

    以前、『mbedボードについてわからないから教えてくれ~』という話があったのですが、その時点で『mbedは触ったことないからわからないよ~』と言わざるをえませんでした。

    で、『mbedって何ぞや?』というのを調べてみたところ、

    • どうやらWebだけで開発環境が完結するものらしい
    • 秋月でも安価なmbed対応のボードがあるっぽい

    ということがわかり、秋月に立ち寄った際に購入したのがNUCLEO-F401REです。秋月で扱っている安価なSM Microのmbedボードは全て1,500円なのですが、その中で一番性能が高そうなものを選んでみました。

    • Cortex-M4 84MHz
    • Flash 512KB
    • SRAM 96KB
    • D/Aコンバータがないものの周辺いろいろ

    ということで、お試しする分には何も問題ないはずです。

    正月休み・・・ということで、元日からトライしてみることにします。テスト環境は LinuxMint13 64bit 環境、ブラウザは Google Chrome でやってみます。

    1.とにかくつないでみる

    とにかくMini-USBのケーブルでホストとつないでみると、

    • デバッガ側(基板のUSBコネクタ側)のLEDが赤点灯
    • ターゲットボード側の赤LEDが点灯
    • ターゲットボード側の緑LEDが高速で点滅
    • USBマスストレージとして認識され、ドライブ内にmbed.htmというファイルが存在

    という状態になりました。このmbed.htmというファイルをGoogle Chromeで開いてみると、mbedのサイトへのログインおよびサインアップのサイトが開きました。

    2.サインアップしてみる

    とにかくSignupを押してユーザー登録してみます。

    すると、『以前にユーザー登録をしたことがあるか(Have you ever signed up on developer.mbed.org before?)』と問われます。

    もちろん初めてですので、「いいえ、以前アカウントを作ったことはありません(No, I haven’t created an acount before)」を押します。

    • メールアドレス
    • ユーザー名
    • パスワード
    • 姓名

    を入れて、「Signup」を押すと、今回購入したボードがデカデカと表示され、関連する情報がズラズラと表示されます。

    • ボードの写真
    • ボードのスペック
    • 基板上の端子の機能説明(Arduino互換コネクタとピンヘッダのそれぞれ)
    • サポートされているシールドの一覧
      (イーサネットやWiFi、Bluetooth、NFC、XBeeなどの近距離ネットワークに加え、GPRSもシールドで対応しているようです。日本ではGPRSは意味がありませんが・・・)

    あわせて、登録したメールアドレスに確認メールが届くので、その中のずらずらと長いHTTPリンクをクリックしてログインし直すと、メールアドレスが確認できた旨(ここだけ日本語で)表示されます。