Stellaris LaunchPad

Stellaris LaunchPad

http://www.tij.co.jp/tool/jp/ek-lm4f120xl
[Stellaris® LM4F120 ローンチパッド評価ボードは、テキサス・インスツルメンツの ARM® Cortex™-M4F ベース・マイコン用、低コストの評価プラットフォームです。]


lpcxpressoと同じように本体とデバッガがつながっているけど、両方に同じLM4F120Hが載っているのに$4.99。

MacOSXでのtoolchain

TIの公式サイトではWindows用のコンパイラは豊富にありますが、MacやLinuxには対応していません。サンプルコードはexe形式で配布でがっかりでしたが、zipで解凍できました。
先日書いたMSP430にはArduino互換IDE EnergiaがあるのでMacでも簡単ですが、こちらはARMでプラットフォームが別なので対応していません。
しかし、ARMだとtoolchainは共通でarm-none-eabiのgccがあれば、使い回せるのでコンパイラは新たに導入する必要はありませんでした。
https://github.com/jsnyder/arm-eabi-toolchain
問題はアップロードのツールですが、これもすでに出ていて、lm4toolsというのがあるので、MacやLinuxでもこのボードが使えます。
https://github.com/utzig/lm4tools

その辺のツールの情報はこちらにまとまっています。
http://blog.y3xz.com/blog/2012/10/29/an-open-toolchain-for-the-ti-stellaris/

Energia

(追記 12/23)2012/12/06に出た本家のenergia-0101E0009からStellarisもサポートされていました。 http://energia.nu/download/からダウンロードすれば、MSP430もStellarisも両方対応していました。

準備ができたのでデータシート見ながらボチボチやろうかと思っていたところ、
http://embedxcode.weebly.com
“The embedXcode project allows to use Xcode to develop for Arduino, chipKIT, LaunchPad MSP430G2xxx and FraunchPad MSP430FR5739, StellarPad, Teensy 3.0, LeafLabs Maple and Wiring boards and platforms. ”
これを使うと貧弱なIDEじゃなく、Xcodeで開発できるというもののようだが、StellarPadってEnergiaはまだ対応してないはずと思って、ソース配布元を見ると
https://github.com/energia/Energia/tree/stellarpad
というブランチができていた。まだ開発途上なのでバイナリ配布はないが、ソースをダウンロードしてビルドしてみた。
Energia-stellarpad/buildで ant とするだけ。
macの場合はmacosx/work/Energia.appができる。IDEを開いてもコンパイルでエラーが出るが、コンパイラはまだ入っていないのだった。
Energia.app/Contents/Resources/Java/hardware/tools/lm4f 以下にはbin/lm4flashがあるのみ。
ここに上で紹介したtoolchainをコピーした。

cp -r ~/arm-cs-tools/* hardware/tools/lm4f/

これでEnergia.appを起動してみると、ちゃんとコンパイルできるようだ。
Blink,FadeなどのLチカはこれで簡単に動作確認できたが、DigitalReadSerialではコンパイルエラーが出る。
todo.txtを見ると確かに「OS X serial driver bug」 とある。
というわけでまだふつうに使える状態にはないが、かなりいいところまで来ていてあとは時間の問題かと。

タグ:
カテゴリー: ARM, Stellaris

LPC1114FN28

いわゆるLPCXpressoというかeclipseが重くて嫌いなので、あまり気が進まないのだが、
command line toolだけでもんなんとかなりそうなのでやってみた。以下の環境はMacOSX。

http://akizukidenshi.com/catalog/g/gI-06071/
32bitなのに110円という衝撃の価格。32bitゆえにレジスタの数とかも多いし複雑なので、初心者向きとはとても思えませんけど。
LPC800という8ピンのやつも来年に出るという。一個$0.39ってフィリックスガム4個分!

接続

FTDI 3.3V ケーブル (秋月) ◯ツのPL2303SAは入手性が悪い。3.3VのFTDIとかならどれでもよい(はず)。


トラ技の解説はやたら複雑な回路になってますが、最小限としてはこれくらいで十分です。

FTDI LPC1114FN28
1 GND GND
2 CTS
3 VCC (3.3V) VCC
4 TXD 15 RXD
5 RXD 16 TXD
6 RTS

ISPモードに切り替えるには24ピン PIO0_1をグランドに落としてから電源をリセットする。
やはりリセット用のスイッチとISP用のスイッチを用意するのが普通のようだが、めんどくさい。
(後述のlpc21ispでは-controlというオプションを使うことでオートリセットできるかも)

FlashMagic


Baudrate 115200
Serial Port /dev/tty.usbserial***
Device LPC1114/102
Xtal Freq 12.000 MHz
として、Identify Deviceを押してシリアルナンバーを取得できれば、
接続はOK。

Firmwareでhexファイルを選択して、startを押せばファイルの書き換えができる。

lpc21isp

エディタからいちいちウィンドウを切り替えるのはやってられないので、
コマンドラインで使えるツールを使う。

lpc21ispはhttps://github.com/Zuph/lpc21ispからソースをダウンロードして、コンパイルする。
Makefileの
CFLAGS += -Wall -static
-staticをコメントアウトしないとコンパイルに失敗する。

lpc21isp.out -detectonly /dev/tty.usbserial* 115200 12000

lpc21isp version 1.83
Synchronizing (ESC to abort). OK
Read bootcode version: 1
7
Read part ID: LPC1114FN.../102, 32 kiB ROM / 4 kiB SRAM (0x1A40902B)

のように検出できた。
アップロードは

lpc21isp.out [filename].hex /dev/tty.usbserial* 115200 12000

とする。

Lチカ

ちょうどよいサンプルコードがあったので、
https://github.com/Zuph/lpc1114-blink
使わせてもらった。

GPIO周りはデータシートでレジスタを調べればよいのだが、
ARMではリンカスクリプトが必要で、その辺は経験がないのでどうもよくわからなくて、gnu ldを勉強したいところです。

http://yuranos.blog11.fc2.com/blog-entry-224.html

こちらでMakefile,リンカスクリプト,main.cの3つのファイルだけの最小限構成でやっていました。lpcxpressoとかでわけのわからないファイルを大量にリンクして簡単にできますという説明ではなく、このようにfrom scratchな解説書が欲しいところです。

参考
http://www.meatandnetworking.com/tutorials/lpc1114fn28-with-open-source-tools/

データシート
http://www.jp.nxp.com/products/microcontrollers/cortex_m0/lpc1100_x_l/LPC1114FN28.html

カテゴリー: ARM, lpc

Ino(IDEを使わずコマンドラインで使う)

http://inotool.org
“Ino is a command line toolkit for working with Arduino hardware”
アイコンがちょっとニセモノ的でアレですが、>とか_はコマンドライン(シェル)を意識したものでしょう。

IDEを使わないでArduinoを使う方法はこれまでにMakefileによる方法について書きました。
InoはPythonで書かれたツールで、必要な情報をboards.txtなどから得て、Makefileなしで自動的にコンパイルすることができます。
以下の話はMacOSXとlinuxだけに適用します。現状Windowsはサポートされていません。

インストール

IDEとして使わなくてもArduino IDEは必要です。(ソースやライブラリを使う)
tarボールを取ってきて普通にコンパイルしてもいいですが、pythonなので、

pip install ino または
easy_install ino

とするだけでできます。
シリアル通信でpicocomというのがいるようなので、Macならmacportsを使い

port install picocom

でインストールしておく。
ubuntuなら

apt-get install picocom

でインストールできる。

使ってみる

ino --help

でコマンド一覧が出るし、
http://inotool.org/quickstart
の通りやってみればよいのだが、やってみて困った点を多少補足する。

適当な場所にプロジェクト用のディレクトリを作る。(Arduinoのsketchフォルダと別で構わない)
そこで

ino init

とすると、空のスケッチ。

ino init -t bink

とすると、blinkをテンプレートとする

.
├── lib
└── src
    └── sketch.ino 

のような構造ができる。src以下のファイルを編集する。

ビルド

ino build

で必要なライブラリなどを自動的に探してコンパイルします。
Arduinoボードの指定は

ino list-models

で名前を探して指定する。
デフォルトはuno, Duemilanove w/ ATmega328だとatmega328など。

ino build -m atmega328

などとする。
ビルドできたファイルは.build以下にある。

アップロード

ino upload

でアップロードします。UNO以外は-m でモデルを指定する。
MacOSでは/usr/local/sttyがPATHで先に来ると失敗しました。
/bin/sttyが先に来るようPATHを調整しました。

シリアル通信

ino serial

とすることでシリアル接続します。
ポートを指定したり、9600baud以外の場合は

ino serial -p /dev/cu.usbmodem* -b 19200 

とする。

こういうの自分で作りたかったんですが、rubyに移植しようかな。

カテゴリー: Arduino, AVR

Leonardoでリモコンを流用する

[以下の話はatmega32u4ベースのArduino Leonardo限定で他のArduinoでは使えません]
Arduino LeonardoにはHID キーボード、マウスの機能が追加されたので、自動で絵を書くものとか面白い使い方がある。
Mac miniではapple remoteが使えるが、MacBookAirでは使えないことにふと気付いた。
まず家電のリモコンをArduinoとかでまとめたいと思って、赤外線のデコードについて調べていたのだが、
プレゼンとかで次に進むのをリモコンでやりたいなと思ったところ、Leonardoを使えば簡単にできることに気付いた。
IRremoteというライブラリのおかげもあって30分くらいでやりたいことのプロトタイプはできた。

赤外線リモコンコードの解析

そもそも赤外線リモコンは何をしているかというと、赤外線LEDをチカチカさせているだけだ。
ただ、自然光で誤動作しないために38kHzのキャリア周波数に乗せている。
以下に方式の解説がある。
http://www.256byte.com/remocon.htm

普通の赤外線LEDにリモコンを向けて信号を送っても起電力が生じて波形を見ることはできる。


これをバンドパスフィルターに通すことで復号することもできるが、
秋月で復号モジュールが100円以下で買えるのでこれを使う。
http://akizukidenshi.com/catalog/g/gI-00622/
1: 5V
2: GND
3: VOUT
で3の電圧を見ればON/OFFのシーケンスになっている。

IRremoteライブラリの完成度が高いので、もう自分で書くのはやめてしまったが、
自分で最初から理解しようと思ったら、AdafruitのLearning Systemがおすすめ。
http://learn.adafruit.com/ir-sensor/overview

IRremote library

https://github.com/shirriff/Arduino-IRremote
ダウンロードしてlibrariesフォルダに入れる。
コードを調べるにはexamples/IRrecvDumpを動かすとシリアルモニタに
方式と復号化されたコードを表示する。
自分の家にあるリモコンのコードの多くはNEC方式だったが、たまに変なものもあった。

既存のリモコンを使ってPCの特定の機能をこれで動かせる。
あとはどのボタンを押したかを判別して、それに応じたキーシーケンスをLeonardoにしゃべらせればよい。

LeonardoのHID Keyboard

Leonardoでのキーボードのキーコード一覧は
http://arduino.cc/en/Reference/KeyboardModifiers
にあり、ファイルとしては
hardware/arduino/cores/arduino/USBAPI.h
に定義がある。

Preview.appでフルスクリーンにするためには
^+cmd+F を押せばよいので、

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('f');
delay(100);
Keyboard.releaseAll();

とする。releaseしない限り同時押しとなる。

プレゼン用リモコンにする



最初にやりたかったことは、
1. Preview.appをフルスクリーンにする
2. 前に進む
3. 後ろに戻る
の3つだけで、apple remoteの
1. PLAY/PAUSE
2. next
3. back
に割り振った。
まだボタンが余っているので、PowerPointでも使えるように、
+ : 始めからスライドショー
– : ここからスライドショー
menu: ESCでスライドショーを中止
とした。
たまたまapple remoteがあったので、これにしたが、
家庭用の他のリモコンも使える。
DEBUGを1にしてシリアルコンソールを起動し、リモコンのボタンを押すと、
キーコードが表示される。
そのコードを自分が使いたい機能 CODE_UPなどに割り振るだけ。
パナソニックの家庭用シーリングライトのリモコンでも同じことができることを確かめた。

追加したい機能があれば、キーボードショートカットを調べ、
そのための関数を作って、リモコンのコードと対応させてやればよい。

ここでは特殊な目的に特化したが、矢印キーなどキーボードのキーそのものであればWindowsでも使えるが、
ショートカットなどはOSに依存してしまう。

// apple remote for MacBookAir(MacOSX)                                          
// 1) play/pause button to fullscreen                                           
// 2) >>| button to next page                                                   
// 3) <<| button to previous page                                               

// decoded code for apple remote                                                
#define CODE_UP   (0x77E1D0D4)
#define CODE_DOWN (0x77E1B0D4)

#define CODE_NEXT (0x77E1E0D4)
#define CODE_BACK (0x77E110D4)
#define CODE_PLAY (0x77E120D4)
#define CODE_MENU (0x77E140D4)

// panasonic ceilling light remote controller                                   
//#define CODE_NEXT (0xF6B92168)                                                
//#define CODE_BACK (0xA2768C92)                                                
//#define CODE_PLAY (0xCA21A230)                                                
//#define CODE_MENU (0x1B9C2A92)                                                

#define DEBUG (1) // set 1 to Serial debug                                      

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

// keycodes are defined in hardware/cores/arduino/USBAPI.h                      
char cmdKey   = KEY_LEFT_GUI; // COMMAND KEY for macosx                         
char ctrlKey  = KEY_LEFT_CTRL;
char leftKey =  KEY_LEFT_ARROW;
char rightKey = KEY_RIGHT_ARROW;
char shiftKey = KEY_LEFT_SHIFT;
char enterKey = KEY_RETURN;
char escKey   = KEY_ESC;

void setup()
{
  irrecv.enableIRIn();// start the IRreceiver                                   

  if (DEBUG) {
    Serial.begin(9600);
    delay(1000);
    Serial.println("IR sensor start");
  }
  Keyboard.begin();
}

void ppt_slideshow()
{
  // to use with PowerPoint                                                     
  // shift+cmd+enter: slideshow from the begininng                              
  Keyboard.press(shiftKey);
  Keyboard.press(cmdKey);
  Keyboard.press(enterKey);
  delay(100);
  Keyboard.releaseAll();
}

void ppt_slideshow_here()
{
  // to use with PowerPoint                                                     
  // cmd+enter      : slideshow from this page                                  
  Keyboard.press(cmdKey);
  Keyboard.press(enterKey);
  delay(100);
  Keyboard.releaseAll();
}
void fullscreen()
{
  // fullscreen for Preview.app                                                 
  Keyboard.press(cmdKey);
  Keyboard.press(ctrlKey);
  Keyboard.press('f');
  delay(100);
  Keyboard.releaseAll();
}

void escape()
{
  Keyboard.press(escKey);
  delay(100);
  Keyboard.releaseAll();
}

void nextpage()
{
  Keyboard.press(rightKey);
  delay(100);
  Keyboard.releaseAll();
}

void backpage()
{
  Keyboard.press(leftKey);
  delay(100);
  Keyboard.releaseAll();
}
void loop()
{
  if (irrecv.decode(&results)) {
    if (DEBUG) {
      // shows decoded IR codes                                                 
      Serial.println(results.value, HEX);
    }

    switch (results.value) {
    case CODE_NEXT:
      if (DEBUG) Serial.println("next page");
      nextpage();
      break;

    case CODE_BACK:
      if (DEBUG) Serial.println("back page");
      backpage();
      break;

    case CODE_PLAY:
      if (DEBUG) Serial.println("full screen");
      fullscreen();
      break;

    case CODE_MENU:
      if (DEBUG) Serial.println("escape");
      escape();
      break;

    case CODE_UP:
      ppt_slideshow();
      break;

    case CODE_DOWN:
      ppt_slideshow_here();
      break;

    default:
      break;
    }
    irrecv.resume();
  }
}
カテゴリー: Arduino

MSP430 LaunchPad

すでにStellaris LaunchPadが500円以下で出ているが、在庫なしのためカッとなってこれを書いた(嘘
一年以上前に出てWindowsでしか使えないので放置していたが、
いつの間にかArduinoのlDEが移植されていた。Energiaという名前である。

バイナリ http://energia.nu/download/
ソース https://github.com/energia/Energia/

Macで動かしてみた。
バイナリ https://github.com/downloads/energia/Energia/energia-0101E0008-macosx.dmg をダウンロードすると、
MSP430LPCDC 1.0.3b.pkgというCDC/ACM driverがある。USBシリアルで接続するために必要なのでまずこれをインストールする。
MSP430ボードを接続してみると、/dev/cu.uart-* のように認識された。Energia.appをApplicationsに入れると、あとはもうArduinoと同じ。

ツール→マイコンボードでLaunchPad w/ msp430g2553 (16MHz)を選択し、シリアルポートで/dev/cu.uart-*を選択する。

その後はもうふつうにArduinoのコードを書くだけで簡単すぎる。
ハードウェアピンの対応は
https://github.com/energia/Energia/wiki/Hardware
にある。シリアルに関してはJ3ジャンパーで切り替えとなっているが、下の図のようにRXD/TXDを切り替えないとハードウェアシリアルとしては使えないようだ。
シリアルを使うコードを動かした後、プログラムの書き換えで失敗することがあるが、一旦ケーブルを抜いて繋ぎ直すと回復した。この辺は少し改善が必要。

LEDが2つあるので交互に点滅するだけのLチカ。ピン番号として、P1_0など基板に書いてある表記も使えるようだ。

int state = 1;

void setup()
{
  //Serial.begin(9600);
  pinMode(P1_6, OUTPUT);
  pinMode(P1_0, OUTPUT);
}

void loop()
{
  digitalWrite(P1_6, state);
  digitalWrite(P1_0, 1-state);
  state = 1 - state;
  //Serial.println("Hello MSP430 ");
  delay(500);
}

プログラムのアップロードは何をやっているかverbose outputで見てみると、

mspdebug rf2500 --force-reset prog *.hex

なので、コマンドラインから叩いてみると、

% mspdebug rf2500
MSPDebug version 0.17 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2011 Daniel Beer 
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Trying to open interface 1 on 004
Initializing FET...
FET protocol version is 30394216
Configured for Spy-Bi-Wire
Set Vcc: 3000 mV
fet: FET returned error code 4 (Could not find device (or device not supported))
fet: command C_IDENT1 failed
fet: identify failed
Trying again...
Initializing FET...
FET protocol version is 30394216
Configured for Spy-Bi-Wire
Sending reset...
Set Vcc: 3000 mV
Device ID: 0x2553
Device: MSP430G2553
Code memory starts at 0xc000
Number of breakpoints: 1

Available commands:
    =         delbreak  gdb       load      opt       reset     simio     
    alias     dis       help      locka     prog      run       step      
    break     erase     hexout    md        read      set       sym       
    cgraph    exit      isearch   mw        regs      setbreak  

Available options:
    color           gdb_loop        iradix          
    fet_block_size  gdbc_xfer_size  quiet           

Type "help " for more information.
Press Ctrl+D to quit.

(mspdebug) 

使えるコマンド一覧があるが、runとかstepとかあるのでデバッガーにもなるようだ。
prog *.hexでuploadできるようだ。

main.c

#include <msp430.h>

int main()
{
  unsigned int i = 0;
  WDTCTL = WDTPW + WDTHOLD;
  // port setting
  P1DIR |= (BIT0+BIT6);
  P1OUT |= (BIT0+BIT6);
  while(1) {
    i++;
    if (i < 10000) {
      P1OUT |= BIT0;
      P1OUT &= ~BIT6;
    }
    if (i > 10000) {
      P1OUT |= BIT6;
      P1OUT &= ~BIT0;
    }
    if (i == 20000) {
      i = 0;
    }
  }
  return 0;
}

Makefile

CC=msp430-gcc
CFLAGS=-Os -Wall -g -mmcu=msp430g2553
OBJCOPY=msp430-objcopy
OBJS=main.o
all: main.elf main.hex
upload: main.hex
        mspdebug rf2500 'prog main.hex'

%.elf: $(OBJS)
        $(CC) $(CFLAGS) -o main.elf $(OBJS)

%.o: %.c
        $(CC) $(CFLAGS) -c $<

%.hex:  %.elf
        $(OBJCOPY) -O ihex $< $@

を使って、main.hexを作り、

mspdebug rf2500 'prog main.hex'

でいけることがわかったので、
make; make upload
とすることでIDEなしでもいけることがわかった。
toolchainはhttp://code.google.com/p/osx-launchpad/
からもダウンロードできるが、Energiaと同じものと思われる。

データシート http://www.tij.co.jp/jp/lit/ug/slau144i/slau144i.pdf

カテゴリー: MSP430

「おねえさんのコンピュータ」をArduinoで

日本科学未来館が公開した「フカシギの数えかた」という動画は「同じところを2度通らない道順の数」を数えるという一見簡単だが、組み合わせ爆発の恐ろしさを教えるものだ。結末がとても狂気じみていて反響が大きかった。
8×8のマトリックスならArduinoでも表示はできるなと思って作ってみた。ただし、組み合わせの数がとても大きいので、現実的な時間では終わらないので、ループはなくても事実上無限ループみたいなものである。
おねえさんのやっている方法はアルゴリズムの教科書などを見れば必ず出てくる深さ優先探索(depth first search)というもので
、再帰的な関数を使って簡単に実装できる。本来は天文学的な時間のかかる場合でもZDDというアルゴリズムを使うと短時間で解けるという背景があるのだが、私の手には負えないのでここではおねえさん止まりである。

8×8のドットマトリックスLEDを使うとして、各LEDの座標x[i],y[i](i=0,..,63)と、i番目のサイトを通ったかどうかという情報v[i]、各サイトから進める隣接サイトの番号dir[i][]、通った道筋の履歴site[]を準備する。
0番目から出発して、次に進めるサイトへどんどん進み、目的地i=63に到達したら、道筋を表示し、進んだ後は引き返して別の道を探すという繰返しである。
arms22さんによるドットマトリクスを表示するためのDotsduinoをたまたま持っていたので、そのためのDotsライブラリを使うことで表示部分は簡単に実装できた。

myDots.write(x,y,HIGH);

のように座標を指定してHIGH,LOWを指定するだけである。
回路図も公開されているので、ドットマトリクスLED部分の接続だけ同じにするとふつうのArduinoでも同じことができる。
いつまでも終わらないちょっと複雑なLチカということで。

動画はこちら

#include <Dots.h>

#define L 8
#define N (L*L)

int x[N], y[N];
uint8_t v[N];
uint8_t dir[N][5];
uint8_t site[N];
uint8_t length = 0;
unsigned long count = 0;

Dots myDots = Dots(9,4,10,6,17,11,16,13, 5,15,14,8,12,7,3,2);

int dist(int i, int j) {
  return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}

void setup()
{
  int i, j, k, n, cnt;
  
  myDots.begin();
  Serial.begin(9600);
  
  n = 0;
  // setup coordinate
  for (i=0; i<L; i++) {
    for (j=0; j<L; j++) {
      x[n] = i;
      y[n] = j;
      n++;
    }
  }
  // setup available directions
  for (i=0; i<N; i++) {
    cnt = 0;
    for (j=0; j<N; j++) {
      if (dist(i, j)==1) {
        dir[i][cnt] = j;
        cnt++;
      }
    }
    dir[i][4] = cnt; // number of available directions
  } 
}

void show()
{
  int i, j;
  // display path
  myDots.clear();
  for (j=0; j<=length; j++) {
	i = site[j];
	myDots.write(x[i],y[i],HIGH);
	myDots.updateWithDelay(10);
  }
  myDots.updateWithDelay(10);
}

void visit(int i)
{
  int j, d;
  v[i] = 1;
  if (i==N-1) {
	// reached the goal and show the path
    show();                                                                   
    count++;
  } else {
    site[length] = i;
    for (j=0; j<dir[i][4]; j++) {
      d = dir[i][j];
      if (v[d] == 0) {
        length++;
        site[length] = d;
		visit(d);
		// traceback to enumerate all the traces
        v[d] = 0;
        length--;
      }
    }
  }
}

void loop()
{
  int i;
  for (i=0; i<N; i++) {
    v[i] = 0;
    site[i] = 0;
  }
  visit(0);
  Serial.println(count); 
}
カテゴリー: Arduino

Raspberry Pi (3)

Lチカ

GPIOとしてP1 1~26の2列ピンヘッダが使える。
http://elinux.org/Rpi_Low-level_peripherals

pin number pin name wiringPi pin pin number pin name wiringPi pin
P1-01 3.3V P1-02 5V
P1-03 GPIO0(SDA) 8 P1-04
P1-05 GPIO 1(SCL) 9 P1-06 GND
P1-07 GPIO 4(GPCLK0) 7 P1-08 GPIO 14(TXD) 15
P1-09 P1-10 GPIO 15(TXD) 16
P1-11 GPIO 17 0 P1-12 GPIO 18(PCM_CLK) 1
P1-13 GPIO 21(PCM_DOUT) 2 P1-14
P1-15 GPIO 22 3 P1-16 GPIO 23 4
P1-17 P1-18 GPIO 24 5
P1-19 GPIO 10(MOSI) 12 P1-20
P1-21 GPIO 9(MISO) 13 P1-22 GPIO 25 6
P1-23 GPIO 11(SCKL) 14 P1-24 GPIO 8(CE0) 10
P1-25 P1-26 GPIO 7(CE1) 11

ユーザーが自由に使えるGPIOは
0,1,4,7,8,9,10,11,14,15,17,18,21,22,23,24,25
の17個あります。

まずLEDを1個点灯させてみる。
P1-07(GPIO 4 = wiringPi 7pin)にLEDと1kΩの抵抗を直列につなぎ、GNDに落したとする。

1. shell で叩く
BeagleBoneと同じだが、UNIX流な方法でデバイスもファイルである。
/sys/class/gpio/export
にポート番号(4)を書き込むとそのポートは使えるようになる。
/sys/class/gpio/gpio4というディレクトリができ、その中のdirectionとvalueでIOを制御する。
directionは “in”か”out”、valueは”1″(HIGH)か”0″(LOW)のいずれか。

echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "1" > /sys/class/gpio/gpio4/value
echo "0" > /sys/class/gpio/gpio4/value
echo "4" > /sys/class/gpio/unexport

2. wiringPiに付属のgpioコマンドを使う。

gpio -g mode 4 out  # GPIO4をoutputにする
gpio -g write 4 1       # GPIO4のHIGHにする
gpio -g write 4 0       # GPIO4をLOWにする

もしくはwiringPiの番号を使うと

gpio mode 7 out
gpio write 7 1
gpio write 7 0

3. libwiringPiを使ったC(Arduino的)

#include <wiringPi.h>

#include <stdio.h>
#include <stdlib.h>

#define	LED 7 // GPIO4                                                          

int main()
{
  int i;

  if (wiringPiSetup() == -1)
    exit(1);

  pinMode(LED, OUTPUT);

  for (i=0; i<10; i++) {
    digitalWrite(LED, 1);
    delay(100);
    digitalWrite(LED, 0);
    delay(100);
  }

  return 0;
}

4. ruby (wiringPi)

#!/usr/bin/env ruby                                                             
require "wiringpi"
LED = 7 # GPIO 4                                                                
io = WiringPi::GPIO.new
io.mode(LED, OUTPUT)
for i in 0..10
  io.write(LED, HIGH)
  sleep(0.1)
  io.write(LED, LOW)
  sleep(0.1)
end

5. python(wiringPi)

#!/usr/bin/python
import wiringpi
import time
LED = 7 # GPIO 4
io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_PINS)
io.pinMode(LED, io.OUTPUT)
for i in range(10):
    io.digitalWrite(LED, io.HIGH)
    time.sleep(0.1)
    io.digitalWrite(LED, io.LOW)
    time.sleep(0.1)
カテゴリー: Raspbery Pi

Raspberry Pi (2)

環境構築

とりあえずdebian/ubuntuではお約束で

sudo apt-get update && sudo apt-get dselect-upgrade

個人的に馴染んだ環境で

sudo apt-get install emacs ruby ruby1.9.1-dev rubygems

ライブラリのインストール

WiringPiというライブラリがあるのでダウンロード
https://projects.drogon.net/raspberry-pi/wiringpi/

https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/

wget http://project-downloads.drogon.net/files/wiringPi.tgz
tar xvf wiringPi.tgz
cd wiringPi/wiringPi
make && sudo make install

ruby, pythonから使う


これをperl / python / rubyから使うには
https://github.com/WiringPi
というのがあるが、rubyの場合は

sudo gem install wiringpi

でOK。

pythonの場合は

sudo easy_install wiringPi

でOK。

おまけ Arduino

ちなみにあまり実用的とはいいがたいが、

sudo apt-get install arduino-core arduino-mk arduino

でArduino IDEをインストールすることもできる。リポジトリは純正のdebianよりもubuntuに近いようだ。
HDMIの画面はインストール時だけで、CPUがあまり速くないので、macからsshでログインして使っている。

カテゴリー: Raspbery Pi

Raspberry Pi (1)

6/1に申し込みで7/18に届きました。

BeagleBoneではSDカードが付いていましたが、こちらで最初にすることはSDカードにイメージを書き込むことです。

1 イメージのダウンロード
http://www.raspberrypi.org/downloads
からRasbian “wheezy”をダウンロードします。RaspbianはDebianをRaspberry Pi向けに最適化したもので本家の推薦となっている。
現時点では
→ 2012-07-15-wheezy-raspbian.img
http://elinux.org/RPi_Easy_SD_Card_Setup
に解説がありますが、MacOSXでコマンドラインでやる場合について書く。

2 まずdisk番号を確かめること。
SDカードを入れる前にdf -hとした後
SDカードを入れた後再びdf -hとしたとき、追加されたのは
/dev/disk3s1 (3、4など環境によって異なる)であれば、

diskutil unmount /dev/disk3s1

とする。
書き込みは

dd bs=1m if=2012-07-15-wheezy-raspbian.img of=/dev/rdisk3 

とした。
diskの取り出しは

diskutil eject /dev/rdisk3

SDカードを取り出してRaspberry Piに入れ、起動すれば無事
RaspbianOSが起動しました。

カテゴリー: Raspbery Pi

STBee Mini

買ったあと放置していてちょっと浦島ですが、質問があったので調べてみた。
Maple miniと大きさ的にはほぼ同じ。そもそも石が同じだったりします。(STM32F103CB)
Maple Mini $34.95に対して、STBee Mini 1974円と圧勝です。まあ純正のボードが秋月で1000円位で買えるのであれですが。
いろいろな方のおかげでmacでもSTBee Miniが使える環境ができているみたいなので、検証してみる。

コンパイラ

コンパイラは自分でビルドしてもいいですが、
libmapleのcommand line toolから
http://static.leaflabs.com/pub/codesourcery/gcc-arm-none-eabi-latest-osx32.tar.gz
をダウンロードして/usr/local/armに入れた。

dfu-utilのインストール

問題はdfuでminiはDFuSeとか独自の拡張がされているので、素のdfu-utilでは使えなかったのですが、
Dfu-utilのページから0.6をダウンロードします。
http://dfu-util.gnumonks.org/
(以前紹介したOpenMokoは2007年頃のものでDfuSeに対応していません。)
展開して、

./autogen.sh
./configure --prefix=/usr/local

ここで、libusbがないなどのエラーが出たらmacportsで
libusb
libusb-compat
などをインストールすればよい。
あとはmake, make installでdfu-utilができます。

STBee MiniでUSERボタンを押しながらRESETを押して離すと
DFUモードになる。この状態で

dfu-util -l

とすると、

Found DFU: [0483:df11]

というのが出て認識できた。

後は適当なbinファイルをアップロードしてみる。
まずはストロベリーリナックスのサンプルminidemo.zipを展開して
makeすると、mini-demo.elfができるので、

arm-none-eabi-objcopy -O binary mini-demo.elf mini-demo.bin

でバイナリ形式に変換。
これを書き込むには

dfu-util -a0 -d 0x0483:0xdf11 -s 0x08003000 -D mini-demo.bin

とすると

Downloading to address = 0x08003000, size = 2756

File downloded successfully
となって成功。
“-s 0x08003000” はdfuseで使われている領域の関係で必要なようです。

libmapleで使う

libmapleは

git clone git://github.com/leaflabs/libmaple.git  libmaple

でダウンロードできる。
このままではMaple board関係しか対応していないが、
リンカーまわりやピンの対応をSTBeeやSTM32VLDに対応させたものが配布されている。
http://hp.vector.co.jp/authors/VA000177/html/2011-08.html
libmapleを使ってArduino likeな開発もできる。
digitalWriteとかは遅いのでともかく、UARTやEthernetなどライブラリが使えるとかなり楽だ。

Makefileのdfu-utilの引数に-s 0x08003000を追加すると
make install
でuploadできた。ただし、makeではpythonでリセットを掛けるようになっているが、
STBee Miniでは手動でDFUモードにしないと動かない。

カテゴリー: stm32
カテゴリー
2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031