2013年12月31日火曜日

ラパンのヘッドライトバルブ交換

大晦日。ラパンのヘッドライトが切れたので、バルブ交換をしました。

 

ボンネットを開け、バルブのコネクタを外します。ロック機能は無く、引っ張るだけです。

 次に、ゴムのカバーを外します。カバーの上下にある耳たぶみたいな所を持って引っ張るだけで外れます。
 外したゴムカバーです。

 バルブを固定しているクリップ型の留め具を外します。留め具の上部の丸い部分がフックに引っかかっています。
 この部分を左右から指でつまむとフックからはずれ、留め具がカランと手前に倒れます。
  

 バルブを抜くとこんな感じ。

 外したバルブを持って、オートバックスに行き、店のお兄ちゃんにこれと同じ物をくれ!と頼みます。買って来たのがこれ。何の変哲も無いハロゲン。


 バルブのガラス部分に触らない様に注意しながら、逆の手順で組み込みます。

 作業完了!

2013年12月23日月曜日

Raspberry Pi (8) IO制御 5

IO制御 5 (モールス信号でIPアドレス表示)


最初に

前回の続きで、ACT_LEDでIPアドレスを表示したいと思います。
1個のLEDで表示するので、モールス信号での表現となります。
うまく行けば、Rpi本体だけで自分のIPアドレスを表示できるはずなのですが...

さて、ACT_LED(GPIO16)をWiringPiライブラリで制御しようと思いましたが、アドレスが設定されていないようです。
今回は、より低レベルの操作が可能なbcm2835.hライブラリを使う事とします。WiringPiよりハード寄りのライブラリなので、面倒ですが細かい制御が出来そうです。


bcm2835.hのインストール

以下のスクリプトを実行して、bcm2835.hをインストールします。

sudo wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.34.tar.gz
tar zxvf bcm2835-1.34.tar.gz
sudo tar zxvf bcm2835-1.34.tar.gz
cd bcm2835-1.34/
sudo ./configure
sudo make
sudo make install

プログラム

  1. bcm2835の初期化
  2. /sys/class/leds/led0/trigger の書き換え
    1. CからUNIXのコマンドを発行する時は、system()を使います。   
    2. このプログラムではこの値を元に戻していないので、実験が終わったら手動で戻しておいてください。
  3. IPアドレスの取得
  4. 一文字づつモールス表示   
    1. ACT LEDはLowで点灯なので注意
    2. トンは100ms、ツーは800ms、休みを400msでやってみました。

// Raspberry Pi でIPアドレス表示 // eth0のアドレスをモールス符号でACTランプに表示させる // 2013.12.23 ImageWriter // Compile: gcc ipaddr2.c -o ipaddr2 -l bcm2835 // USAGE: sudo ./ipaddr2 // // ACT_LED = GPIO-16 , Active-Low // ACT_LED is SD-Card acsess lamp in default. // For disable ACT_LED,
"echo none >/sys/class/leds/led0/trigger" // Then,eneble ACT_LED,
"echo mmc0 > /sys/class/leds/led0/trigger" #include < stdio.h > #include < string.h > #include < unistd.h > #include < sys/types.h > #include < sys/socket.h > #include < arpa/inet.h > #include < netdb.h > #include < errno.h > #include < linux/if.h > #include < sys/ioctl.h > #include < bcm2835.h >
// bcm2835.h from
http://www.airspayce.com/mikem/bcm2835/index.html #define out_LED 16 // ACT_LED active-low // モールス符号 char M0[]= "-----"; char M1[]= ".----"; char M2[]= "..---"; char M3[]= "...--"; char M4[]= "....-"; char M5[]= "....."; char M6[]= "-...."; char M7[]= "--..."; char M8[]= "---.."; char M9[]= "----."; char Mdot[]= ".-.-.-"; const char* GetMyIpAddr(const char* device_name); /** * 自マシンのIPアドレスを取得します。 * @param デバイス名(e.g. "eth0") * @return 「数値とドット」記法のアドレス */ const char* GetMyIpAddr(const char* device_name) { //指定したデバイス名のIPアドレスを取得します。 int s = socket(AF_INET, SOCK_STREAM, 0); struct ifreq ifr; ifr.ifr_addr.sa_family = AF_INET; strcpy(ifr.ifr_name, device_name); ioctl(s, SIOCGIFADDR, &ifr); close(s); struct sockaddr_in addr; memcpy( &addr, &ifr.ifr_ifru.
ifru_addr, sizeof(struct sockaddr_in) ); return inet_ntoa(addr.sin_addr); } // ACT_LED disable void ACT_LED_mode(int mo){ if(mo==0){ // Contorole by my program system("echo none >/sys/class/leds/led0/trigger"); } else { // Contorole by system system("echo mmc0 > /sys/class/leds/led0/trigger"); } } // 出力初期設定 void out_init(void){ bcm2835_gpio_fsel(out_LED,
BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_write(out_LED, HIGH);
// ACT_LED is active low } // モールス発生 void morse_encode(char *pc){ int i,a; //loop,morse-length a=strlen(pc); //morse-length for(i=0;i < =a-1;i++){ if(pc[i]=='.'){ printf("%c\n",'.'); bcm2835_gpio_write(out_LED, LOW);
// ton! bcm2835_delay(100); } else { printf("%c\n",'-'); bcm2835_gpio_write(out_LED, LOW);
// tuuu! bcm2835_delay(800); } bcm2835_gpio_write(out_LED, HIGH); bcm2835_delay(400); // char break } bcm2835_delay(1000);
// word break printf("\n"); } // モールス変換 void morse_decode(char c){ int i,a; //ループカウンタ char *pc; //モールス符号のポインタ switch(c){ case '0': pc = M0; //符号のポインタを渡す。 morse_encode(pc); //モールス発生。 break; case '1': pc = M1; morse_encode(pc); break; case '2': pc = M2; morse_encode(pc); break; case '3': pc = M3; morse_encode(pc); break; case '4': pc = M4; morse_encode(pc); break; case '5': pc = M5; morse_encode(pc); break; case '6': pc = M6; morse_encode(pc); break; case '7': pc = M7; morse_encode(pc); break; case '8': pc = M8; morse_encode(pc); break; case '9': pc = M9; morse_encode(pc); break; case '.': pc = Mdot; morse_encode(pc); break; default: break; } } int main(){ bcm2835_init() ; // bcm2835_init out_init(); // GPIO-16 output mode ACT_LED_mode(0); const char* r = GetMyIpAddr("eth0");
// Get IP-ADDRES const int a = strlen(r); // ADDRESS length for(;;){ int i; // Loop for(i = 0; i < = a; i++) { // Loop in ADRS length printf ("%c:",r[i]); morse_decode(r[i]); // morse-sending } printf("\n"); bcm2835_gpio_write(out_LED, HIGH); // 消灯 bcm2835_delay(4000); // Wait next line. } return 0; }

無事、モールス信号でIPアドレスが表示されました。
でも、私は電話級アマ免許しかもっておらずCW通信もした事がないので、このスピードでも読み取れません。(^^;)
作ってはみたけれど、私にとってはちょっと実用的じゃありませんでした。
点滅の回数で数字を表した方が良かったかもW。

Raspberry Pi (7) IO制御 4

IO制御 4 (配線不要 ! もっとも簡単なLチカ)


最初に

ちょっと趣向を変えて、最も簡単なLチカをやってみます。
Raspberry PiでLチカと言うと、LEDと抵抗とリード線を買ってきて繋げるのが一般的だと思います。
実はそんなことしなくてもオンボードのLEDを点滅させる事が出来ます。
オンボードには5個のLEDが実装されています。

  1. ACT(SDカードのアクセス)
  2. PWR(電源表示)
  3. FDX(full duplex)
  4. LNK(リンク)
  5. 100(100Base)
この内、下の4つはハードウエアで制御されており、CPU(BCM2835)から操作はできません。
唯一ACTランプだけは、CPUのポート(GPIO16)に接続されており、プログラミングが可能です。
但しデフォルトでは、SDカードのアクセスランプとしてOSが制御しているので、その動作を止める必要があります。

点滅の方法

  1. まずrootユーザーになります。

    su -

    もし、rootのパスワードを設定していないのであれば、設定してからsu - を実行します。

    sudo passwd root

  2. 次にACTランプの動作を停止させます。

    echo none >/sys/class/leds/led0/trigger

  3. 次にmodprobeで、LED点滅用のモジュールを組み込みます。

    modprobe ledtrig_heartbeat

  4. LEDを点滅させます。

    echo heartbeat >/sys/class/leds/led0/trigger

    点滅しましたか?
  5. 実験が終わったら、元に戻します。

    echo mmc0 > /sys/class/leds/led0/trigger

    下記のコマンドを打って、mmc0が[]で括られていたら正常に戻っています。

    cat /sys/class/leds/led0/trigger
    none [mmc0] heartbeat

このサイトを参考にさせて頂きました。
Can we control the on-board leds

次は、このLEDを使ってモールス信号を出したいと思います。

2013年12月15日日曜日

Raspberry Pi (6) IO制御 3

IO制御 3 (7SEG表示)


最初に

一桁の7SEGLEDの表示をしてみます。
少しは実用的にと思ったので、自分のIPアドレスを表示する物を作ってみました。
このプログラムを起動時に実行する様にしておけば、出先などで自動取得したアドレスを知る事ができ、モニタレスでSSH接続が可能になります。
一桁しか無く、順番に数字を表示しますので、プログラムは少し工夫が必要です。
表示と消灯のタイミングをうまく設定すれば、

---- '1' '9' '2' '.' '1' '6' '8' '.' '0' '.' '1' '1' ----

と数字が読めるので意外と実用的です。

デメリットとしては、GPIOを全て(8点)使い尽くしてしまう事です。7SEGやめて、モールス信号の方が良かったかな?

プログラムの概要

  1. ipアドレスを取得します。このサイトを参考にさせて頂きました。
    自マシンのIPアドレスを取得(Linux)
  2. 一文字ずつ取り出し、数字に合わせてLEDのセグメントを表示します。
    一文字あたり、500ms点灯させ、250ms消灯します。
  3. 最後まで表示したら、バー(真ん中のセグメント)を点滅(50ms点灯、50ms消灯を10回繰り返し)して、しばらく消灯(500ms)します。
  4. 最初の文字から繰り返します。

手順

  1. カソードコモンタイプの7SEG LEDを一個と、330Ω位の抵抗を8本、プリント基板とリード線を用意します。
  2. 図の様に接続します。
  3. プログラムを作成します。

    // IPアドレス表示 // eth0のアドレスを7セグメントLED一桁に一文字ずつ表示します。 // 7セグメントLEDは以下の様になっている。 // // SEG WrIO pin // --- a --- a 0 17 // | | b 1 12 // f b c 2 13 // | | d 3 15 // --- g --- e 4 16 // | | f 5 18 // e c g 6 22 // | | dot 7 7 // --- d --- // dot // 各セグメントをONする事で数字を表示させる。 // 例えば数字1はb,cセグメントなので、pin1,2をONさせれば良い。 #include < stdio.h > #include < string.h > #include < unistd.h > #include < sys/types.h > #include < sys/socket.h > #include < arpa/inet.h > #include < netdb.h > #include < errno.h > #include < linux/if.h > #include < sys/ioctl.h > #include < wiringPi.h > const char* GetMyIpAddr(const char* device_name); /** * 自マシンのIPアドレスを取得します。 * @param デバイス名(e.g. "eth0") * @return 「数値とドット」記法のアドレス */ const char* GetMyIpAddr(const char* device_name) { //指定したデバイス名のIPアドレスを取得します。 int s = socket(AF_INET, SOCK_STREAM, 0); struct ifreq ifr; ifr.ifr_addr.sa_family = AF_INET; strcpy(ifr.ifr_name, device_name); ioctl(s, SIOCGIFADDR, &ifr); close(s); struct sockaddr_in addr; memcpy( &addr, &ifr.ifr_ifru.ifru_addr, sizeof(struct sockaddr_in) ); return inet_ntoa(addr.sin_addr); } // 出力初期設定 void out_init(void){ pinMode (0, OUTPUT) ; pinMode (1, OUTPUT) ; pinMode (2, OUTPUT) ; pinMode (3, OUTPUT) ; pinMode (4, OUTPUT) ; pinMode (5, OUTPUT) ; pinMode (6, OUTPUT) ; pinMode (7, OUTPUT) ; } // セグメント表示 void out_0(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, HIGH); digitalWrite (4, HIGH); digitalWrite (5, HIGH); digitalWrite (6, LOW); digitalWrite (7, LOW); } void out_1(void){ digitalWrite (0, LOW); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, LOW); digitalWrite (7, LOW); } void out_2(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, LOW); digitalWrite (3, HIGH); digitalWrite (4, HIGH); digitalWrite (5, LOW); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_3(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, HIGH); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_4(void){ digitalWrite (0, LOW); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, HIGH); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_5(void){ digitalWrite (0, HIGH); digitalWrite (1, LOW); digitalWrite (2, HIGH); digitalWrite (3, HIGH); digitalWrite (4, LOW); digitalWrite (5, HIGH); digitalWrite (6, LOW); digitalWrite (7, LOW); } void out_6(void){ digitalWrite (0, HIGH); digitalWrite (1, LOW); digitalWrite (2, HIGH); digitalWrite (3, HIGH); digitalWrite (4, HIGH); digitalWrite (5, HIGH); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_7(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, LOW); digitalWrite (7, LOW); } void out_8(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, HIGH); digitalWrite (4, HIGH); digitalWrite (5, HIGH); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_9(void){ digitalWrite (0, HIGH); digitalWrite (1, HIGH); digitalWrite (2, HIGH); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, HIGH); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_d(void){ digitalWrite (0, LOW); digitalWrite (1, LOW); digitalWrite (2, LOW); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, LOW); digitalWrite (7, HIGH); } void out_bar(void){ digitalWrite (0, LOW); digitalWrite (1, LOW); digitalWrite (2, LOW); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, HIGH); digitalWrite (7, LOW); } void out_off(void){ digitalWrite (0, LOW); digitalWrite (1, LOW); digitalWrite (2, LOW); digitalWrite (3, LOW); digitalWrite (4, LOW); digitalWrite (5, LOW); digitalWrite (6, LOW); digitalWrite (7, LOW); } void led_Out(char adrs_char){ switch(adrs_char){ case '0': printf("0\n"); out_0(); break; case '1': printf("1\n"); out_1(); break; case '2': printf("2\n"); out_2(); break; case '3': printf("3\n"); out_3(); break; case '4': printf("4\n"); out_4(); break; case '5': printf("5\n"); out_5(); break; case '6': printf("6\n"); out_6(); break; case '7': printf("7\n"); out_7(); break; case '8': printf("8\n"); out_8(); break; case '9': printf("9\n"); out_9(); break; case '.': printf(".\n"); out_d(); break; } } int main(){ wiringPiSetup () ; out_init(); const char* r = GetMyIpAddr("eth0"); // ipアドレスの取得 const int a = strlen(r); // 文字長さ取得 for(;;){ int i; // ループカウンタ for(i = 0; i <= a; i++) { // ループ //printf("%c\n", r[i]); // 一文字ずつ表示 led_Out(r[i]); delay(500); out_off(); delay(250); } printf("\n"); out_off(); for(i = 0; i <= 10; i++){ delay(50); out_bar(); delay(50); out_off(); } delay(500); } return 0; }

  4. コンパイルします。

    $ gcc -Wall -o ipaddr ipaddr.c -lwiringPi

  5. 実行します。ipアドレスが一桁ずつ、順番に表示されます。

    $ sudo ./ipaddr

    停止は、ctrl-cを押します。

Raspberry Pi (5) IO制御 2

IO制御 2 C言語でテスト

最初に

前回 IO制御 1 は、シェルからIOのテストを行いましたが、今回はC言語でプログラムを作ってみます。

WiringPiと言うライブラリを使うと比較的簡単にIO制御をする事が出来ます。(前回のgpioコマンドはこのライブラリの一部です)

手順

  1. WirigPiサイトからテストプログラムを拾ってきます。

    blink.c

    自分の回路に合わせて、少し編集します。
    私の回路は25番pin(WiringPiでは6番)にLEDを繋げてありますので、6に変更します。

    #include < wiringPi.h > // wiringPiライブラリを使います。 main () { wiringPiSetup () ; // 初期設定 pinMode (6, OUTPUT) ; // 6番pinを出力に設定 for (;;) // 無限ループ { digitalWrite (6, HIGH) ; // 6番pinをHigh(ON)に delay (500) ; // 500ms待つ digitalWrite (6, LOW) ; // 6番pinをLow(OFF)に delay (500) ; // 500ms待つ } }

  2. コンパイルします。ワーニングが出ますが気にしないで。

    $ gcc -Wall -o blink blink.c -lwiringPi
    blink.c:2:5: warning: return type defaults to ‘int’ [-Wreturn-type]

  3. 実行します。LEDが1秒間隔(500ms+500ms)で点滅すれば成功です。

    $ sudo ./blink

    停止は、ctrl-cを押します。

Raspberry Pi (4) Macからファイル共有

Macからファイル共有

Raspberry Pi上のファイルをMacからアクセスできる様にします。

手順

  1. Netatalkのインストール
    Netatalkと言うのは、AFP (AppleTalk Filing Protocol)によるファイルサーバー機能を行うソフトウエアです。

    sudo apt-get install netatalk

    を実行します。
  2. Macから接続します。
    1. メインメニューバーから、移動、サーバーの接続を選択します。
    2. afp://[Raspberryのアドレス] を入れて、接続を押します。
    3. ユーザー名とパスワードを入力すれば、接続完了です。
      これで、MacからRaspberyy Piのファイルをアクセスできる様になります。

2013年12月8日日曜日

Raspberry Pi (3) IO制御 1

Raspberry PiでIO制御 1

Raspberry PiでIO制御をしてみます。

InterFace12月号の記事を元に、まずは設定とLEDの点灯テストを行います。

手順

  1. raspi-blacklist.confの編集。spiとi2cが使えるようにコメントアウトします。

    sudo vim /etc/modprobe.d/raspi-blacklist.conf

    として、先頭に#を入れてコメントアウトします。

    # blacklist spi and i2c by default (many users don't need them)
    #blacklist spi-bcm2708
    #blacklist i2c-bcm2708

  2. デバイス作成時のアクセス権の設定。

    sudo vim /etc/udev/rules.d/50-udev.rules

    として、以下の文を書き込みます。

    KERNEL=="spidev*", SUBSYSTEM=="spidev", GROUP="spi", MODE="0666"

  3. Pythonモジュールをインストールします。

    sudo apt-get install python-dev python-smbus python-setuptools i2c-tools

    と打ち込むと、

    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています
    状態情報を読み取っています... 完了
    以下のパッケージが自動でインストールされましたが、もう必要とされていません:
    libblas3gf liblapack3gf
    これを削除するには 'apt-get autoremove' を利用してください。
    以下の特別パッケージがインストールされます:
    libssl-dev libssl-doc python-pkg-resources python2.7-dev
    提案パッケージ:
    libi2c-dev python-distribute python-distribute-doc
    以下のパッケージが新たにインストールされます:
    i2c-tools libssl-dev libssl-doc python-dev
    python-pkg-resources python-setuptools python-smbus
    python2.7-dev
    アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 1 個。
    32.0 MB のアーカイブを取得する必要があります。
    この操作後に追加で 43.2 MB のディスク容量が消費されます。
    続行しますか [Y/n]? y

    .........

    man-db のトリガを処理しています ...
    libssl-dev (1.0.1e-2+rpi1) を設定しています ...
    libssl-doc (1.0.1e-2+rpi1) を設定しています ...
    python2.7-dev (2.7.3-6) を設定しています ...
    python-dev (2.7.3-4+deb7u1) を設定しています ...
    python-pkg-resources (0.6.24-1) を設定しています ...
    python-setuptools (0.6.24-1) を設定しています ...
    i2c-tools (3.1.0-2) を設定しています ...
    /run/udev or .udevdb or .udev presence implies active udev. Aborting MAKEDEV invocation.
    python-smbus (3.1.0-2) を設定しています ...

    となれば成功です。失敗した時は、sudo apt-get updateを行って、もう一度トライして下さい。
  4. 次にpythonのソースリストを入手します。

    git clone git://github.com/doceme/py-spidev

    次の様になれば成功です。

    Cloning into 'py-spidev'...
    ./hello
    ./hello
    remote: Counting objects: 9, done.
    remote: Compressing objects: 100% (8/8), done.
    remote: Total 9 (delta 2), reused 5 (delta 1)
    Receiving objects: 100% (9/9), 5.56 KiB, done.
    Resolving deltas: 100% (2/2), done.

    更に、次のコマンドを打ち込みます。

    cd py-spidev/
    chmod 755 setup.py
    sudo ./setup.py install

    次の様になれば成功です。

    running install
    running build
    running build_ext
    building 'spidev' extension
    creating build
    creating build/temp.linux-armv6l-2.7
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/src/linux/include -I/usr/include/python2.7 -c spidev_module.c -o build/temp.linux-armv6l-2.7/spidev_module.o
    creating build/lib.linux-armv6l-2.7
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-armv6l-2.7/spidev_module.o -o build/lib.linux-armv6l-2.7/spidev.so
    running install_lib
    copying build/lib.linux-armv6l-2.7/spidev.so -> /usr/local/lib/python2.7/dist-packages
    running install_egg_info
    Writing /usr/local/lib/python2.7/dist-packages/spidev-2.0.egg-info

  5. 次にWiringPi(GPIO Interface library for the Raspberry Pi)のソースをダウンロード、インストールします。

    git clone git://git.drogon.net/wiringPi

    次の様になれば成功です。

    Cloning into 'wiringPi'...
    remote: Counting objects: 599, done.
    remote: Compressing objects: 100% (541/541), done.
    remote: Total 599 (delta 425), reused 96 (delta 58)
    Receiving objects: 100% (599/599), 233.09 KiB | 121 KiB/s, done.
    Resolving deltas: 100% (425/425), done.

    次に、以下のコマンドを実行します。

    cd wiringPi/
    $git pull origin
    chmod 755 build
    ./build

    途中でワーニングが出ますが、おそらく成功でしょう。

    wiringPi Build script
    =====================


    WiringPi Library
    [UnInstall]
    [Compile] wiringPi.c
    [Compile] wiringSerial.c
    [Compile] wiringShift.c
    [Compile] piHiPri.c
    [Compile] piThread.c
    [Compile] wiringPiSPI.c
    [Compile] wiringPiI2C.c
    [Compile] softPwm.c
    [Compile] softTone.c
    [Compile] mcp23008.c
    [Compile] mcp23016.c
    [Compile] mcp23017.c
    [Compile] mcp23s08.c
    [Compile] mcp23s17.c
    [Compile] sr595.c
    [Compile] pcf8574.c
    [Compile] pcf8591.c
    [Compile] mcp3002.c
    [Compile] mcp3004.c
    [Compile] mcp4802.c
    [Compile] mcp3422.c
    [Compile] max31855.c
    [Compile] max5322.c
    [Compile] sn3218.c
    [Compile] drcSerial.c
    [Link (Dynamic)]
    [Install Headers]
    [Install Dynamic Lib]

    WiringPi Devices Library
    [UnInstall]
    [Compile] ds1302.c
    [Compile] maxdetect.c
    [Compile] piNes.c
    [Compile] gertboard.c
    [Compile] piFace.c
    [Compile] lcd128x64.c
    [Compile] lcd.c
    [Compile] piGlow.c
    [Link (Dynamic)]
    [Install Headers]
    [Install Dynamic Lib]

    GPIO Utility
    [Compile] gpio.c
    gpio.c:85:12: warning: ‘decodePin’ defined but not used [-Wunused-function]
    [Compile] extensions.c
    [Compile] readall.c
    [Link]
    [Install]

    All Done.

    NOTE: This is wiringPi v2, and if you need to use the lcd, Piface,
    Gertboard, MaxDetext, etc. routines then you must change your
    compile scripts to add -lwiringPiDev

  6. pythonで使える様にWiring-pythonをインストールします。

    git clone https://github.com/WiringPi/WiringPi-Python.git

    以下の様になれば成功です。

    Cloning into 'WiringPi-Python'...
    remote: Counting objects: 195, done.
    remote: Compressing objects: 100% (96/96), done.
    remote: Total 195 (delta 98), reused 181 (delta 91)
    Receiving objects: 100% (195/195), 255.08 KiB | 134 KiB/s, done.
    Resolving deltas: 100% (98/98), done.

    次のコマンドを実行します。

    cd WiringPi-Python/
    git submodule update --init

    次の様になればOKです。

    Submodule 'WiringPi' (https://github.com/WiringPi/WiringPi.git) registered for path 'WiringPi'
    Cloning into 'WiringPi'...
    remote: Counting objects: 206, done.
    remote: Compressing objects: 100% (119/119), done.
    remote: Total 206 (delta 113), reused 173 (delta 86)
    Receiving objects: 100% (206/206), 149.91 KiB | 111 KiB/s, done.
    Resolving deltas: 100% (113/113), done.
    Submodule path 'WiringPi': checked out 'dda3305ce14a750e7529ff20b0acf9e53bd8eb7a'

    最後にインストールします。

    sudo python setup.py install

    以下の様になれば完了です。

    running install
    Checking .pth file support in /usr/local/lib/python2.7/dist-packages/
    /usr/bin/python -E -c pass
    TEST PASSED: /usr/local/lib/python2.7/dist-packages/ appears to support .pth files
    running bdist_egg
    running egg_info
    writing wiringpi.egg-info/PKG-INFO
    writing top-level names to wiringpi.egg-info/top_level.txt
    writing dependency_links to wiringpi.egg-info/dependency_links.txt

    ....................

    Extracting wiringpi-1.1.0-py2.7-linux-armv6l.egg to /usr/local/lib/python2.7/dist-packages
    Adding wiringpi 1.1.0 to easy-install.pth file

    Installed /usr/local/lib/python2.7/dist-packages/wiringpi-1.1.0-py2.7-linux-armv6l.egg
    Processing dependencies for wiringpi==1.1.0
    Finished processing dependencies for wiringpi==1.1.0

  7. コマンドラインからテストをします。適当な発光ダイオードと抵抗(330Ω位でいいでしょう)を図の様GPIO25とGroundに繋ぎます。

    次のコマンドを入力します。

    gpio -g mode 25 out
    gpio -g write 25 1
    gpio -g write 25 0

    最初の行は、25番ピンを出力にしますよ。と言う意味です。
    次のwrite 25 1でLEDが点灯します。(25番ピンがHi=3.3Vになる。)
    次のwrite 25 0でLEDが消灯します。(25番ピンがLo=0.0Vになる。)

うまくLEDが点灯しましたか?

2013年12月7日土曜日

Raspberry Pi (2) VNC接続

raspberry piに VNC接続してみましょう。

VNCとはVirtual Network Computingの略で、リモート端末からGUIで操作できる仕組みです。SSHではCUI操作しか出来ませんでしたが、これを使えば、テレビが無くても自分のPC(Mac)のモニタ上にRaspberry Piのデスクトップ画面を表示する事が出来ます。
  1. raspberry piのターミナルを立ち上げるか、SSH接続します。
  2. sudo apt-get install x11vnc と打って、vncサーバーをインストールします。
  3. 次の様な質問がされますので、yを押します。
  4. あれっ、インストールに失敗してしまいました。なぜでしょう?
  5. 書いてある通り、apt-get updateをしてみましょう。アップデートが成功したようです。
  6. 気を取り直して、もう一度VNCをインストールしてみましょう。sudo apt-get install x11vncと打って...今度は成功したようですよ。
  7. 次にVNC接続する為のパスワードを設定します。x11vnc -storepasswd と打ってから、パスワードを入力します。パスワードを入れると書き込んでも良いですか?と聞いて来るので y を押します。
  8. VNC接続をする前に、GUI(X画面)が立ち上がっていないと接続できないようなので、startxでGUIデスクトップを起動します。こんな画面になれば、多分GUIデスクトップは起動しています。
  9. この状態では、SSHコンソールからコマンドが打てませんので、一度ctrl-Cでxを停止してから x11vnc -usepw としてvncを起動します。ここで表示されたポート番号5900を覚えておきます。
  10. MacからVNC接続してみましょう。移動>サーバーへ接続 のアドレス欄に vnc://xxx.xxx.xxx.xxx:5900と打って接続をしてください。
  11. 暗号化していない注意が表示されますが、そのまま続行します。    
  12. パスワードを聞いてくるので、先ほど書き込んだパスワードを入れます。
  13. おおっ。繋がりました。
  14. 当然、インターネットにも繋がります。
  15. 追記(20140615)
    このままだと、すぐに接続が切れてしまう事があります。x11vnc -usepw -forever としてあげれば、ずーっと接続可能です。
Evernote から送信

Raspberry Pi (1) SSH接続

raspberry pi にSSH接続してみましょう。

サーバー用途として、raspberry piを使うときはテレビに繋ぐのではなく、外部の端末から操作出来れば楽ですので、SSH接続できるようにしてみましょう。
SSHとは、Secure SHellの略で、外部のマシンから安全に接続する事が出来るプロトコルの事です。
  1. raspberry pi を立ち上げます。
  2. ターミナルを立ち上げて、sudo raspi-configと打ちます。
  3. SSHと言う項目にカーソルキーで移動して、リターンキーを押します。
  4. SSHをEnableするかDiableするか聞いて来るので、Enableを選択してリターンを押します。
  5. 了解の所で、リータンキーを押します。     
  6. 画面が戻りますので、finishまで戻ってリターンを押します。これでraspberry pi側の設定は完了です。
  7. 操作する側のPC(Mac)でターミナルを開きます。  
  8. 続いて、SSH pi@xxx.xxx.xxx.xxx (xxxはraspberry piのアドレス)と打ち込みます。この画面にはありませんが、一番最初に接続するときは、Aer you sure you continue connecting (yes/no)と聞いて来るので、yesと入れます。その後、パスワードを聞いてきますので、パスワードを入れます。  
  9. これでSSH接続が出来ました。試しに何かコマンドを打ってみましょう。これで、コマンドラインでの操作は全て外部の端末から操作する事が可能になりました。              
Evernote から送信

OSXでHello_world

OSXでHello_world

OSXのC言語でHello worldを表示させるプログラムを作ります。

極めて原始的な方法(すべてコマンドライン)で作りますので、 例えば、Linuxでも手順は同じです。

手順

  1. ターミナルを起動します。
  2. vimを起動し、以下のソースリストを打ち込みます。 ファイル名はHello.cとします。

    #include < stdio.h >
    int main(void)
    {
      printf("Hello world\n");
    }

    1行目は、stdio.h と言う画面表示用の標準ライブラリ(STanDard IOライブラリ)を使えるようにする為の物です。
    2行目は、メイン関数と言う物で、この下の{}で括られたプログラムが実行されます。
    4行目で、文字列を表示しています。

    \n
    と言うのは、改行を示します。
    Macの場合、バックスラッシュと¥は異なる文字コードとなっていますので注意が必要です。

  3. コンパイルします。

    gcc hello_world.c -o hello ⏎

    MacでもLinuxでもGCCと言うCコンパイラでCプログラムの実行ファイルを作ります。
    -o オプションで出力されるファイル名を指定します。

  4. 出来上がったHelloというプログラムを実行すると、文字列が表示されます。

    ./hello ⏎
    Hello world

    ./
    と言うのは、このディレクトリにあるプログラムを実行しますよ。と言う意味です。
    これが無いと、

    hello ⏎
    -bash: hello: command not found

    と怒られます。


OSXにnkfをインストール

OSXにNKF(Network Kanji Filter)をインストールした記録です。

まず、最初にXCODEをインストールしておきます。


最後に、コンソールで次のコマンドを打ち込みます。

mkdir /usr/local ⏎
cd nkf-2.1.3 ⏎
make ⏎
sudo make install ⏎


Evernote から送信