ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示
ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示

2016年5月1日日曜日

Raspberry Pi 3 インストールの巻(3) LAMP環境のセットアップ

お約束だとは思いますが、LAMP環境をセットアップしておきます。この辺は情報がいっぱいあると思うのでさらっと。
# はまったのは、phpのデフォルトDocument rootが、/var/www/ じゃなくて、/var/www/html だったこと。

apt-getで必要なファイルをget

  • LAMP環境をget

          sudo apt-get install apache2 php5 php5-mysql mysql-server    
  • VIMもget

          sudo apt-get install vim    
  • phpMyAdminをget。

          sudo apt-get install phpmyadmin    

テスト用のファイルを準備

  • phptest画面を作成。(デフォルトではDocument root は/var/www/htmlになっているので注意。)
        cd /var/www/html
        # vimで、phptest.phpというファイルに、<?php phpinfo(); ?>という内容を書きます。

        sudo vim phptest.php
        cat phptest.php 
        <?php phpinfo(); ?>
  • 同じく、phpMyAdminのRootを変更します。

        # vimで、apache2.confの最後に Include /etc/phpmyadmin/apache.confを追記します。

        sudo vim /etc/apache2/apache2.conf
        tail -1 /etc/apache2/apache2.conf
        Include /etc/phpmyadmin/apache.conf
      
  •     # apacheをリスタートします。
        sudo /etc/init.d/apache2 restart

テスト実行

  • MySQLの動作チェック
          mysql -u root -p    
  • phpの動作チェック

    • ブラウザのアドレスにhttp://IPアドレス を打ち込んで、it worksと表示されればOK。
  • phpMyAdminの動作チェック

  • phptest.phpの動作チェック

​

Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

2016年4月30日土曜日

Raspberry pi 3 インストールの巻(2)

ここでは、無線LANの設定と、日本語の表示、漢字入力を設定します。

1.インターフェースを確認。
 すでに有線LANはDHCPで接続されていますが、無線LANはSSIDなどのセットアップが必要です。
    最新のRaspbianでは、これもGUI上から可能です。
    右上のLAN接続アイコンをクリックすると、無線LANの一覧が表示されます。

2.SSIDを入力。
     無線LANのインターフェースを選ぶと、SSIDを要求されてくるので入力します。


3.接続が成功すると、無線LANがつながったアイコンに変わります。

4.アイコンをクリックすると接続中の無線LANにチェックが入っています。

5.コンソールで ifconfig と打つと無線LANのアドレスが表示されます。

6.続いて、ロケーションの設定をします。
(読み進めるとわかりますが、このやり方は順番が間違っています。まあ、失敗を繰り返す事で物事の仕組みが分かってくるので、わざと失敗してみてください^^)
Menu->Raspberry Pi configurationに進み、
Location,Set Locationを選択。

7.言語をjp、国をJP、文字セットをUTF-8にします。

8.タイムゾーンをJapanにします。

9.キーボードをJapanのjapaneseにします。

10.Wifi設定をJPにします。
 えっ。今更?もう電波出しちゃってますけど。
     良い子の皆さんは、最初にこれをしとくべきかも。

11.一度リブートします。

12.リブートしましたが、デスクトップ画面が思いっきり文字化けしてます。^^
日本語フォントが入っていないのに、ロケールをJPにしちゃったんで、こうなっちゃったんです。

13.慌てて、IPAフォントをインストールします。
     コンソールから、sudo apt-get install fonts-ipaexfont と打って、何か聞いてきたら(文字化けしてさっぱりわかんないけど、これだけの容量使うけどいい?って聞いてきます)、yを押します。

14.リブートすると無事、日本語が表示されました。ホッ。

15.ブラウザもちゃんと日本語表示されます。

16.ちなみにIPAフォントというのはこういうものです。


17.日本語インプットメソッドをインストールします。
     実は、ここまでやっても日本語の入力はできません。IME(OSXでいうと"ことえり"などの漢字変換インターフェースのこと)をインストールします。
コンソールから、sudo apt-get install uim uim-mozc と入力し、先ほどと同じように、途中で何か聞いてきたらyを押してください。
インストールが完了し、リブートするとデスクトップの右上に"あ"のアイコンが出現して、日本語変換が可能となります。

18.UIM、UIM-MOZCはこんなものです。

次は、LAMP環境をインストールしてみます。
Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

Raspberry Pi 3 インストールの巻(1)

マルツさんのGW特別売り出しで、ラズパイ3が安くなってたので、ポチったら本日届きました。
早速OSをインストールしてみます。

まず、NOOBSによる、Raspbianのインストールを行います。
NOOBSとはお手軽にいろんなOSをラズパイにインストールできる仕組みのようです。従来のようにRaspbianを単独でダウンロードすることもできますが、SDカードにOSイメージを焼くのに少々面倒なのでこの様な方法が出てきたのだと思います。

1.NOOBSのダウンロード。
     から、NOOBSのDownload ZIP を選択します。
保存して、展開しておきます。
2.MicroSDカードをMacに差し込んで、ディスクユーティリティーを起動します。
     SDカード(できるだけ速度が速いもの。今回は贅沢に64GBですが、8GBで十分)を選択し、フォーマットはMS-DOS、適当な名前をつけて、消去を押します。
3.ZIPを解凍し、解凍したフォルダ直下の全ファイルをSDカードにコピーします。
     以前は、ddコマンドでセクタコピーしてたのですが、NOOBS使うと、こんな簡単な方法で良いようです。
     これをRaspberry Pi 3に差し込みます。

4.電源とモニタ、キーボード、マウス、有線LANを接続し、起動します。あっけないほど簡単にNOOBSのブート画面が出ました。


5.当然、Raspbianを選択し、Installを押します。(Windows10IoTなども選べるようになっているのは、有線LANに接続しているからみたいです。)


6.SDカードの中身を全部消して良いか?聞いてくるので、yesを押します。



7.インストールが開始されました。



8.インストールには10分以上かかります。辛抱強く待ちます。
     いいえ、一度昼寝します。



9.目覚めると、無事インストールが成功していました。



10.OKを押すと、Linuxが起動します。


11.パスワードも要求されずに、自動的にXデスクトップも立ち上がりました。
昔は、こんなん簡単じゃなかったんだよ。ってつい二三年前のことですが。


続いて、ラズパイ3の目玉、無線LANを設定します。
Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

2015年4月19日日曜日

20150418 オープンハードカンファレンス Nagano

おそらく長野県初(ワタクシ調べ)であろう、オープンハード系カンファレンスのレポートです。

会場は、長野市。折角なので、善光寺で(40分待ちの)回行柱にさわってから、徒歩で向かいます。

場所は県庁の近くですが、松本市民の私はちょっと迷いました。GoogleMapを見ながらウロウロ。

到着した時は既にKiCADのプレゼンがちょうど終わる頃。残念。結構賑わっています。

子供向けのrubyは小学低学年の子でも簡単にプログラミングが出来ます。
男の子がロボットを動かしています。

圧巻は、小学生(だったけ?)女の子による手作り段ボール製迷路のプレゼン!
迷路のテンプレートを公開しているとの事。オープンハードの原点ですね。

そして、本日最大の目玉のRaspberry Piで焼くラズベリーパイ!
とても美味しかったです。ごちそうさまでした。

59800円の3Dプリンタで女の子用のアクセサリ作ったり、(ほしい!...あっ3Dプリンタ"を"ですよ。)

やたら "なんかアレなんで" が口癖のPepperがいたり。
あと、ご覧の様にお子さんや、女子率が高く、とっても楽しい!
(カワユイ女子大生のLTもあったのだよ)

色々な人と知り合えて、とても有意義な一日でした。
GeekLabの皆さん(とその家族の方)、展示者、プレゼンの皆さん、とてもありがとうございました。
パイとコーヒーも無料で頂いちゃって、申し訳ないです。

あと関係ないですが、中国土産で買って来たFoxconnベスト(作業着)に気がついて声をかけて頂いた、安曇野の○○さん、ありがとねー。

Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

2014年1月4日土曜日

Raspberry Pi (9) LCD表示 1

LCD表示 1 (SPI接続でQVGA LCDパネル表示)


最初に

AitendoからSPI制御のQVGA LCDパネルM-TM022-SPIを入手したので接続してみました。
このLCDはSPIで接続できるので、簡単な配線だけで表示が可能です。
またドライバICはILI9340という物ですが、この辺のドライバICはどれも似たような コマンド体系を持っているようなので、他のドライバの資料を参考にする事が出来ます。
参考:LCD&タッチセンサ活用の素

実験を行う前にbcm2835ライブラリのインストールとSPIが使える準備をしておいてください。

材料

  1. 2.2インチ液晶モジュール(240x320/SPI)[M-TM022-SPI]
  2. 抵抗(220Ω位。私は手元に470Ωしかなかったので、それを代用)
  3. 26pinの2列ソケット。出来れば10pinの1列ソケットも。

配線

  1. 配線は簡単です。下記のソースリストを参考にしてください。

プログラム

  1. SPIの初期化

    SPIの初期化はbcm2835ライブラリのサンプルプログラムをそのままお借りしました。
    SPI access
    SPIのモードは以下の様にセッティングしました。

    1. MSBFIRST
    2. MODE0
    3. Clock divide=8
    4. CS=Lo

  2. パネルの初期化

    パネルの初期化はAitendoのサンプルプログラムを流用しました。
    デモコード(8051)

  3. RGB565フォーマット変換

    このLCDの1画素あたりの色情報は16ビットであり、そのフォーマットはRGB565などと呼ばれています。
    RGB565フォーマットとは赤5ビット、緑6ビット、青5ビットで色を表す仕組みで、データの並びは"RRRRRGGG GGGBBBBB"の様になっており、 2バイトで色を表現できるのでプログラムが楽になります。
    但し2バイトだと色数が限られるので、現在のパソコンはは24ビット(8bit*3色)で表現する事が多い。両者を変換するルーチンを用意しておくと便利です。
    詳しくは、16 ビット RGB の操作 - MSDN - Microsoft を見てください。

  4. ILI9340のコマンド

    コマンド発行の仕方
    ILI9340はコマンドを発行し、直後にデータを送信する。と言う形式で操作します。
    D/CラインをLoにしてからデータ送信するとコマンドと解釈されます。
    D/CラインをHighにしてからデータ送信するとデータと解釈されます。
    コマンドは非常に沢山ありますが、基本的に下記の三つのコマンドだけで描画が可能です。

    1. xアドレス(座標)セットコマンド (0x2A)
      操作したいx座標をセットするには、コマンド0x2Aを発行し、その後にスタートアドレス2バイト、エンドアドレス2バイトを送信します。
      1画素だけ操作したい場合はスタートアドレス=エンドアドレスとします。
    2. yアドレス(座標)セットコマンド (0x2B)
      同様に操作したいy座標をセットするには、コマンド0x2Bを発行し、その後にスタートアドレス2バイト、エンドアドレス2バイトを送信します。
      1画素だけ操作したい場合はスタートアドレス=エンドアドレスとします。
    3. メモリ書き込みコマンド (0x2C)
      0x2Cコマンドを発行し、その後にデータ2バイト(RGB565)を送信すると上記のアドレス(1画素)にデータ(色)が書き込まれます。
      更に連続してデータを送信するとエンドアドレスまで順々にデータが書き込まれます。この機能を使えば、矩形の塗りつぶし(FILL)を高速に実行できます。
  5. 直線の描画

    ドライバ標準のコマンドだけでは、点か矩形しか描画が出来ません。任意の直線を引くには計算が必要です。
    どこかから2D描画ルーチンを拝借するのが一番手っ取り早いのですが、お正月で暇なので、復習を兼ねて直線描画ルーチンを書いてみます。 (これを車輪の再発明と言います)
     参考にしたのは、1982年発行 ポケットコンピューティング―情報化時代の知的ツール (アスキーブックス) [単行本]乾 謙一 (著)  名機PC-1500の活用本、何十年ぶりに開きました。

    ブレゼンハムのアルゴリズムが元になっているらしいですが、整数演算だけで直線描画が出来るので、非常に高速です。
    動きを簡単に説明すると、座標をx方向に移動しながら、傾きの余りが残っていたらY座標を1ドット上に上げる。と言う方法で直線を描きます。  傾きが45度以上になる時は、移動方向を入れ替えます。

完成したプログラム

// LCD test program 20130103 by ImageWriter
// ili9340.c
// This is M-TM022-SPI(controled by ILI9340) LCD-panel test program on Raspberry Pi.
// Used by bcm2835 library.(Mike McCauley)
// 
// After installing bcm2835, you can build this
// with something like:
// gcc -o spi ili9340.c -l bcm2835
// sudo ./ili9340
//
//  [Pin connection]
//  M-TM022-SPI     Rpi(pin)
//  ------------------------
//  MISO------------MISO(21)
//  LED---220ohm----3.3V( 1)
//  SCK-------------SCLK(23)
//  MOSI------------MOSI(19)
//  D/C-------------IO17(11)  LOW = 0 = COMMAND
//  RES-------------IO18(12)  LOW = 0 = RESET
//  CS--------------CS0 (24)  LOW = 0 = Chip Select
//  GND-------------0V  ( 6)
//  VCC-------------3.3V( 1)
//  ------------------------
//  
//  [SPI settings (spi_init())]
// ORDER MSB First
// MODE Mode0
// Divide 8
// CS  CS0
// CS_POL LOW
//
//

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

#define D_C  17  // GPIO17=D/C
#define RES_ 18  // GPIO18=RESET

int a,data;

// SPI interfase initialize
// MSB,mode0,clock=8,cs0=low
void spi_init(void){
 bcm2835_spi_begin();
 bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default MSBFIRST
 bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default MODE0
 bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_8); // The default 65536
 bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default CS0
 bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default LOW
 // Send a byte to the slave and simultaneously read a byte back from the slave
 // If you tie MISO to MOSI, you should read back what was sent
}

// SPI setup
void spi_reset(void){
 bcm2835_gpio_fsel(D_C,BCM2835_GPIO_FSEL_OUTP); // D/C
 bcm2835_gpio_fsel(RES_,BCM2835_GPIO_FSEL_OUTP); // Reset
 bcm2835_gpio_write(D_C, HIGH);   // D/C = H

 bcm2835_gpio_write(RES_, LOW);   // Reset
 bcm2835_delay(100);
 bcm2835_gpio_write(RES_, HIGH);   // Reset off
 bcm2835_delay(100); 
}

// SPI Write Command
// D/C=LOW then,write command(8bit)
void write_command(unsigned char c){
 int data;
 bcm2835_gpio_write(D_C,LOW);
 data = bcm2835_spi_transfer(c);
 bcm2835_gpio_write(D_C,HIGH);
// printf("COMMAND: %02X\n", c);
// printf("DATA: %02X\n", data);
}

// SPI Write Data
// D/C=HIGH then,write data(8bit)
void write_data(unsigned char c){
 int data;
 bcm2835_gpio_write(D_C,HIGH);
 data = bcm2835_spi_transfer(c);
}

// ILI9340 initialize
//  see M-TM022-SPI demo code(8051)
void lcd_initial(void){
  write_command(0xCB);  
  write_data(0x39); 
  write_data(0x2C); 
  write_data(0x00); 
  write_data(0x34); 
  write_data(0x02); 

  write_command(0xCF);  
  write_data(0x00); 
  write_data(0XC1); 
  write_data(0X30); 

  write_command(0xE8);  
  write_data(0x85); 
  write_data(0x00); 
  write_data(0x78); 

  write_command(0xEA);  
  write_data(0x00); 
  write_data(0x00); 

  write_command(0xED);  
  write_data(0x64); 
  write_data(0x03); 
  write_data(0X12); 
  write_data(0X81); 

  write_command(0xF7);  
  write_data(0x20); 

  write_command(0xC0);    //Power control 
  write_data(0x23);   //VRH[5:0] 

  write_command(0xC1);    //Power control 
  write_data(0x10);   //SAP[2:0];BT[3:0] 

  write_command(0xC5);    //VCM control 
  write_data(0x3e); //
  write_data(0x28); 

  write_command(0xC7);    //VCM control2 
  write_data(0x86);  //--

  write_command(0x36);    // Memory Access Control 

  //
  //0x48 0x68
  //0x28 0xE8

  write_data(0x48); //

  write_command(0x3A);    
  write_data(0x55); 

  write_command(0xB1);    
  write_data(0x00);  
  write_data(0x18); 

  write_command(0xB6);    // Display Function Control 
  write_data(0x08); 
  write_data(0x82);
  write_data(0x27);  

  write_command(0xF2);    // 3Gamma Function Disable 
  write_data(0x00); 

  write_command(0x26);    //Gamma curve selected 
  write_data(0x01); 

  write_command(0xE0);    //Set Gamma 
  write_data(0x0F); 
  write_data(0x31); 
  write_data(0x2B); 
  write_data(0x0C); 
  write_data(0x0E); 
  write_data(0x08); 
  write_data(0x4E); 
  write_data(0xF1); 
  write_data(0x37); 
  write_data(0x07); 
  write_data(0x10); 
  write_data(0x03); 
  write_data(0x0E); 
  write_data(0x09); 
  write_data(0x00); 

  write_command(0XE1);    //Set Gamma 
  write_data(0x00); 
  write_data(0x0E); 
  write_data(0x14); 
  write_data(0x03); 
  write_data(0x11); 
  write_data(0x07); 
  write_data(0x31); 
  write_data(0xC1); 
  write_data(0x48); 
  write_data(0x08); 
  write_data(0x0F); 
  write_data(0x0C); 
  write_data(0x31); 
  write_data(0x36); 
  write_data(0x0F); 

  write_command(0x11);    //Exit Sleep 
  bcm2835_delay(120); 
  
  write_command(0x29);    //Display on 
  write_command(0x2c); 
}

// RGB565 conversion
// RGB565 is R(5)+G(6)+B(5)=16bit color format.
// Bit image "RRRRRGGGGGGBBBBB"
// 
unsigned int rgb565_conv(unsigned int r,unsigned int g,unsigned int b){
 unsigned int RR,GG,BB;
 RR = (r * 31 / 255) << 11;
 GG = (g * 63 / 255) << 5;
 BB = (b * 31 / 255);
 return(RR | GG | BB);
}

// Write data word
//
unsigned int write_data_w(unsigned int w){
 unsigned char hi,lo;
 hi = (char) (w >> 8);
 lo = (char) (w & 0x00FF);
 write_data(hi);
 write_data(lo);
}

// Addres set (1point)
//
void addset(unsigned int x, unsigned int y){
 write_command(0x2A); // set column(x) address
 write_data_w(x);
 write_data_w(x);
 write_command(0x2B); // set Page(y) address
 write_data_w(y);
 write_data_w(y);
 write_command(0x2C); // Memory Write
}

// Addres set 2 (rectangle)
//
void addset2(unsigned int x1, unsigned int y1,
      unsigned int x2, unsigned int y2 ){
 write_command(0x2A); // set column(x) address
 write_data_w(x1); // set start x
 write_data_w(x2); // set end x
 write_command(0x2B); // set Page(y) address
 write_data_w(y1); // set start y
 write_data_w(y2); // set end y
 write_command(0x2C); // Memory Write
}

// Mem read
int mem_read(unsigned int x0, unsigned int y0){
 int data;
 write_command(0x2A); // set column(x) address
 write_data_w(x0);
 write_data_w(x0);
 write_command(0x2B); // set Page(y) address
 write_data_w(y0);
 write_data_w(y0);
 write_command(0x2E);
 bcm2835_gpio_write(D_C,HIGH);
 data = bcm2835_spi_transfer(0x00); // dummy data
 data = bcm2835_spi_transfer(0x00);
 printf("%02X",data);
 data = bcm2835_spi_transfer(0x00);
 printf("%02X:",data);
}

void dot_plot(unsigned int x,unsigned int y){
 addset(x,y);
 write_data_w(rgb565_conv(255,255,255)); //plot
}


// line plot
//
//                          /---(x1,y1) -
//                     /---/            |
//                /---/                 dy
//     (x0,y0)---/                      |
//        |<--------- dx --------->|    -
//        |<--- SS --->|

void line_plot(int x0,int y0,int x1,int y1){
 int  dx,dy,  // difference x,y
  SS,  // rest
  XX,YY,  // plot point
  temp,  
  ADDX,ADDY; // Addition X,Y

 if(x0>240 | y0>320 | x1>240 | y0>320) return;

 dx = x1-x0;  // dx
 dy = y1-y0;  // dy
 if(dx>0){  // plot direction x
  ADDX=  1;
 } else if(dx<0){
  ADDX= -1;
 } else {
  ADDX=  0;
 }
 if(dy>=0){  // plot direction y
  ADDY=  1;
 } else if(dy<0){
  ADDY= -1;
 } else {
  ADDY=  0;
 }
 if(abs(dx)>=abs(dy)){ // if angle < 45deg
  SS = abs(dx/2);
  XX = x0;
  YY = y0;

  while (XX != x1+ADDX){
   //printf("XX,YY:%d,%d\n",XX,YY);
   addset(XX,YY);
   write_data_w(rgb565_conv(255,255,255)); //plot
   SS = SS - abs(dy);
   if(SS > 0){
    XX = XX + ADDX;
    YY = YY;
   } else {
    XX = XX + ADDX;
    YY = YY + ADDY;
    SS = SS + abs(dx);
   }
  }
 } else {
  SS = abs(dx/2);
  XX = x0;
  YY = y0;

  while (YY != y1+ADDY){
   //printf("XX,YY:%d,%d\n",XX,YY);
   addset(XX,YY);
   write_data_w(rgb565_conv(255,255,255)); //plot
   SS = SS - abs(dx);
   if(SS > 0){
    XX = XX;
    YY = YY + ADDY;
   } else {
    XX = XX + ADDX;
    YY = YY + ADDY;
    SS = SS + abs(dy);
   }
  }

 }

}
 
int main(int argc, char **argv)
{
 if (!bcm2835_init())
  return 1;
 
 spi_init();
 spi_reset();
 lcd_initial(); 

 int i,j; 

 // color bar
 for(i=0;i<240;i++){   // x = 0 to 239
  for(j=0;j<320;j++){  // y = 0 to 319 
   //write_data(rand());
   //write_data(rand());
   if(j<106){
    addset(i,j);
    write_data_w(rgb565_conv(255,0,0)); //red
   } else if(j<212) {
    addset(i,j);
    write_data_w(rgb565_conv(0,255,0)); //green
   } else { 
    addset(i,j);
    write_data_w(rgb565_conv(0,0,255)); //blue
   }
  }
 }

 // rectangle fill
 addset2(200,200,200+30,200+30); // x1,y1,x2,y2
 for(i=0;i<30*30;i++){
  write_data_w(rgb565_conv(64,128,32)); // fill 
 }
 
 // line plot(radial)
 line_plot(100,100, 50, 80);
 line_plot(100,100, 50,120);
 line_plot(100,100,150, 80);
 line_plot(100,100,150,120);

 line_plot(100,100, 80, 50);
 line_plot(100,100,120, 50);
 line_plot(100,100, 80,150);
 line_plot(100,100,120,150);
 
 line_plot(100,100, 62, 62);
 line_plot(100,100, 62,138);
 line_plot(100,100,138, 62);
 line_plot(100,100,138,138);

 line_plot(100,100,100, 48);
 line_plot(100,100,100,152);
 line_plot(100,100,152,100);
 line_plot(100,100, 48,100);
 
 // line_plot(rectangle)
 line_plot(10,10,10,50);
 line_plot(10,50,50,50);
 line_plot(50,50,50,10);
 line_plot(50,10,10,10);

 bcm2835_delay(1000);

 // line_plot(random)
 int x0,y0,x1,y1;
 for(i=0;i<50;i++){
  x0=(char)rand();
  y0=((char)rand()*2);
  x1=(char)rand();
  y1=((char)rand()*2);
  line_plot(x0,y0,x1,y1);
//  printf("%d,%d,%d,%d\n",x0,y0,x1,y1);
 }

 //for(i=0;i<240;i++){
 // for(j=0;j<320;j++){
 //  //dot_plot(i,j);
 //  //printf("%d:%d:",i,j);
 //  mem_read(i,j);
 // }
 //}
 //mem_read(10,10);

 bcm2835_spi_end();
 bcm2835_close();
 return 0;
}

最初に3色のカラーバーを表示し、その後、放射状の線の描画、矩形のフィルを行った後、ランダムに直線を描きます。

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 から送信