トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

DIY/RaspberryPi/Lチカ

Last-modified: 2015-03-05 (木) 21:15:45 (958d)
Top / DIY / RaspberryPi / Lチカ

DIY/RaspberryPi

いつものやつ

OS 入れてシリアルコンソールもできるようになったので、次はいつもの L チカ行ってみましょう。

wiringPi

RPi Low-level peripherals - eLinux.org を見ていると下の方に "GPIO Code examples" という章があり、サンプルコードとライブラリの紹介が。

この中に wiringPi という GPIO を叩く C のライブラリがありました。
今回はこれを使わせてもらいましょう。

Raspberry Pi | Wiring | Download & Install | Gordons Projects の情報を元にすると、

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build


git から clone して、ビルドするだけ。
わたくしの手元でも上記で OK でした。

wiringPi/examples にサンプルコードが入ってまして、blink.c ってのが L チカのコードですね。

/*
 * blink.c:
 *      Standard "blink" program in wiringPi. Blinks an LED connected
 *      to the first GPIO pin.
 *
 * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
 ***********************************************************************
 * This file is part of wiringPi:
 *      https://projects.drogon.net/raspberry-pi/wiringpi/
 *
 *    wiringPi is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Lesser General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    wiringPi is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public License
 *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
 ***********************************************************************
 */

#include <stdio.h>
#include <wiringPi.h>

// LED Pin - wiringPi pin 0 is BCM_GPIO 17.

#define LED     0

int main (void)
{
  printf ("Raspberry Pi blink\n") ;

  wiringPiSetup () ;
  pinMode (LED, OUTPUT) ;

  for (;;)
  {
    digitalWrite (LED, HIGH) ;  // On
    delay (500) ;               // mS
    digitalWrite (LED, LOW) ;   // Off
    delay (500) ;
  }
  return 0 ;
}


0.5 秒毎に ON/OFF するプログラムのようですね。
ピンは GPIO の 17 番。下記参照。

led1.jpg


コンパイルします。

$ gcc -o blink blink.c -lwiringpi


GPIO17 に LED (緑)と抵抗120Ωを接続して、プログラム実行!
wiringPi で作成したプログラムは root 権限が必要なので、sudo を付与します。

$ sudo ./blink


点灯しました!

led2.jpg

クロス開発環境

実機上で L チカはできました。
今度はそれと同様のことを手元で行うべく、クロス開発環境を作ります。
これ以降のコマンドラインは母艦の Ubuntu 上なのでご注意を。

tool chain

Raspberry Pi のリポジトリにクロスコンパイルツールがありますので、
クローンします。

$ git clone https://github.com/raspberrypi/tools.git


ソースではなくビルド済みのバイナリが入っています。
わたくしの場合、Ubuntu 64bit 版なので、下記のディレクトリの tool chain を使用します。

$ pwd
/xxx/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
$ ls
arm-linux-gnueabihf-addr2line     arm-linux-gnueabihf-gfortran
arm-linux-gnueabihf-ar            arm-linux-gnueabihf-gprof
arm-linux-gnueabihf-as            arm-linux-gnueabihf-ld
arm-linux-gnueabihf-c++           arm-linux-gnueabihf-ld.bfd
arm-linux-gnueabihf-c++filt       arm-linux-gnueabihf-ld.gold
arm-linux-gnueabihf-cpp           arm-linux-gnueabihf-ldd
arm-linux-gnueabihf-ct-ng.config  arm-linux-gnueabihf-nm
arm-linux-gnueabihf-dwp           arm-linux-gnueabihf-objcopy
arm-linux-gnueabihf-elfedit       arm-linux-gnueabihf-objdump
arm-linux-gnueabihf-g++           arm-linux-gnueabihf-pkg-config
arm-linux-gnueabihf-gcc           arm-linux-gnueabihf-pkg-config-real
arm-linux-gnueabihf-gcc-4.8.3     arm-linux-gnueabihf-ranlib
arm-linux-gnueabihf-gcc-ar        arm-linux-gnueabihf-readelf
arm-linux-gnueabihf-gcc-nm        arm-linux-gnueabihf-size
arm-linux-gnueabihf-gcc-ranlib    arm-linux-gnueabihf-strings
arm-linux-gnueabihf-gcov          arm-linux-gnueabihf-strip
arm-linux-gnueabihf-gdb

Hello World

まずは軽く Hello World。

#include <stdio.h>

int main()
{
    printf("Hello World.\n");
    return 0;
}


下記のようなファイルを用意。

export SDKTARGETSYSROOT=<tool chain のバイナリがある場所を指定>
export ARCH=arm
export CROSS_COMPILE=$SDKTARGETSYSROOT/arm-linux-gnueabihf-

export AS="$CROSS_COMPILE"as
export LD="$CROSS_COMPILE"ld
export CC="$CROSS_COMPILE"gcc
export CXX="$CROSS_COMPILE"g++
export CPP="$CROSS_COMPILE"gcc" -E"
export AR="$CROSS_COMPILE"ar
export NM="$CROSS_COMPILE"nm
export STRIP="$CROSS_COMPILE"strip
export OBJCOPY="$CROSS_COMPILE"objcopy
export OBJDUMP="$CROSS_COMPILE"objdump


作ったファイルを source して、コンパイル。

$ $CC -o helloworld main.c 


無事実行ファイルができました。実機上でも動作 OK。

wiringPi のビルド

clone するとこまでは一緒ですが、build スクリプトは実行しません。
実機上でビルドすることを想定されている内容なので、
X64 なライブラリが /usr/lib や /usr/local/lib に置かれてしまいます(苦笑

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi/wiringPi
$ make ARCH=$ARCH CC=$CC


これで Raspberry なライブラリができます。

$ file libwiringPi.so.2.25 
libwiringPi.so.2.25: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=12a55724b5fa96ecd042efbe1e5a613a103b4fd9, not stripped


ここまできて実機で動かした blink のビルドができます。

適当なディレクトリに libwiringPi を放り込んで、リンク。

$ ln -s libwiringPi.so.2.25 libwiringPi.so


とりあえず同じところに wiringPi.h と blink.c も突っ込んだ上で、コンパイル。

$ $CC -o blink blink.c -I. -L. -lwiringPi


これまた実行ファイルができましたので、Raspberry Pi に転送し、実行!
上記と同じ動作が確認できたら完了です。

さて、次は何をやろうか。。(^^;


2015/03/05 : 1st


添付ファイル: fileled2.jpg 1193件 [詳細] fileled1.jpg 1181件 [詳細]