2014年11月30日日曜日

Eclipseで.rcファイルを使う

昔作った.rcファイルを使ったアプリを流用して Eclipseで開発しようとしたけど
.rcファイルをどう処理するべきか わからなかったので、ググってみた。

下のリンクで説明されてた通りやってみたら上手くいった! 
http://magisix.blog26.fc2.com/blog-entry-504.html



 下記はリソースファイルがプロジェクトフォルダの直下にある前提で記載

【手順1】 ビルド時にwndresでオブジェクトが作成されるようにする


 プロジェクトを右クリック→プロパティ


プロジェクトのプロパティが表示されるので
 ・左側の”C/C++ビルド”の”設定”をクリック
 ・”ビルド・ステップ”のタブをクリック
 ・コマンドの欄に windres ../MenuBar.rc MenuBar.o を入力して”適用”

 ※ビルド時のカレントフォルダは"Debug"なので、"../"で1下位層上がって.rcファイルを指定します


【手順2】作成されたオブジェクトファイルがリンクされるようにする
 ・”ツール設定”のタブをクリック
 ・コマンドの欄に MenuBar.oへのパスを入力して”適用”






2014年10月7日火曜日

Bluetoothお勉強中

勉強のために新しいBluetoothについて調べ始めた。
書籍を調べていきなりびっくりBluetooth4.0(Bluetooth SMART)って
Bluetooth3.0以前と基本的には互換性ないのね・・・。
互換性を持たすには両対応しているBluetooth SMART READYのロゴ
のあるものでなければいけないんだ・・・紛らわしい。



2014年3月22日土曜日

raspberry piでサーボモーターを動かしてみる

久しぶりにraspberry piを動かしてみる。
今回はサーボモーター制御に挑戦。

ちょっと実験死体だけなのでサーボモーターは安いものを
物色した結果、AmazonからSG90を購入。
2個で\980 でとってもリーズナブル。


サーボモーターは信号のONの時間により位置合わせをしてくれるモーターで、
今回のSG90は 回転角 0°~180°で対応する信号幅は
0.5ms~2.5msである。



本当はPWMを使うといいのだが、とりあえずソフトウェアでGPIOを叩いて
制御してみることにする


前にLED点滅制御で作ったプログラムをちょっと変更して

作ってみる

なんか動きがぎこちないがとりあえず思ったとおりに動いた。


MotionのWebカメラ制御と組み合わせて、ネットワーク越しに
カメラの向きを制御できると面白そうだ。




ソース・コード
------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

//  レジスタブロックの物理アドレス
#define PERI_BASE     0x20000000
#define GPIO_BASE     (PERI_BASE + 0x200000)
#define BLOCK_SIZE    4096
//  ピン機能(BCM2835)
#define GPIO_INPUT    0x0       //  入力
#define GPIO_OUTPUT   0x1       //  出力
#define GPIO_ALT0     0x4
#define GPIO_ALT1     0x5
#define GPIO_ALT2     0x6
#define GPIO_ALT3     0x7
#define GPIO_ALT4     0x3
#define GPIO_ALT5     0x2

//  gpio[n]: GPIO 関連レジスタ (volatile=最適化によって消滅させない→必ず実メモリにアクセスさせる)
static volatile unsigned int *gpio;
//  gpio_init: GPIO 初期化(最初に1度だけ呼び出すこと)
void gpio_init ()
{
    int fd;
    void *gpio_map;
    //  /dev/mem(物理メモリデバイス)を開く(sudo が必要)
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1) {
        printf("error: cannot open /dev/mem (gpio_setup)\n");
        exit(-1);
    }
    //  mmap で GPIO(物理メモリ)を gpio_map(仮想メモリ)に対応づける
    gpio_map = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, GPIO_BASE );
    if ((int) gpio_map == -1) {
        printf("error: cannot map /dev/mem on the memory (gpio_setup)\n");
        exit(-1);
    }
    //  mmap 後は不要な fd をクローズ
    close(fd);
    //  gpio[index]: 整数 uint32 の配列としてレジスタへのアクセスを確立
    gpio = (unsigned int *) gpio_map;
}
//  gpio_configure: ピン機能を設定する(ピンを使用する前に必ず設定)
//      pin : (P1) 2,3,4,7,8,9,10,11,14,15,17,18,22,23,24,25,27
//            (P5) 28,29,30,31
//      mode: GPIO_INPUT, _OUTPUT, _ALT0, _ALT1, _ALT2, _ALT3, _ALT4, _ALT5
void gpio_configure (int pin, int mode)
{
    //  ピン番号チェック
    if (pin < 0 || pin > 31) {
        printf("error: pin number out of range (gpio_configure)\n");
        exit(-1);
    }
    //  レジスタ番号(index)と3ビットマスクを生成
    int index = pin / 10;
    unsigned int mask = ~(0x7 << ((pin % 10) * 3));
    //  GPFSEL0/1 の該当する FSEL (3bit) のみを書き換え
    gpio[index] = (gpio[index] & mask) | ((mode & 0x7) << ((pin % 10) * 3));
}
//  gpio_set/clear: ピンをセット (3.3V),クリア (0V)
void gpio_set (int pin)
{
    //  ピン番号チェック(スピードを追求するなら省略してもよい)
    if (pin < 0 || pin > 31) {
        printf("error: pin number out of range (gpio_set)\n");
        exit(-1);
    }
    //  ピンに1を出力(3.3V 出力)
    gpio[7] = 0x1 << pin;   //  GPSET0
}
void gpio_clear (int pin)
{
    //  ピン番号チェック(スピードを追求するなら省略してもよい)
    if (pin < 0 || pin > 31) {
        printf("error: pin number out of range (gpio_clear)\n");
        exit(-1);
    }
    //  ピンに0を出力(0V 出力)
    gpio[10] = 0x1 << pin;  //  GPCLR0
}
#define SERVO01 17
#define SERVO02 18
#define INTERVAL_TIME 22000
#define SERVO_MOVE_MAX 180
#define SERVO_DEGREE_0_TIME 500
static void servo(unsigned long int PinNo,unsigned long int Angle);
static void servo(unsigned long int PinNo,unsigned long int Angle)
{

unsigned long int Time_H;
unsigned long int Time_L;

/* 制御角度は0~180度に限定 */
Angle = Angle % (SERVO_MOVE_MAX+1);


Time_H = SERVO_DEGREE_0_TIME+((Angle*2000)/SERVO_MOVE_MAX);
Time_L = INTERVAL_TIME - Time_H;

printf("PinNo(%02d):Time:%09d[us]\n",PinNo,Time_H);

gpio_set(PinNo);
    usleep(Time_H);
gpio_clear(PinNo);
    usleep(Time_L);
}
#define WAIT_TIME (2*1000*1000)
int main ()
{
signed long int j;

gpio_init();                        //  オマジナイ
    gpio_configure(SERVO01, GPIO_OUTPUT);
    gpio_configure(SERVO02, GPIO_OUTPUT);


/*
[INITIALIZE]
角度0℃に設定
*/
printf("TEST000\n");
for(j=0;j<10;j++){
servo(SERVO01,0);
servo(SERVO02,0);
}
usleep(WAIT_TIME);

while (1) {

/*
0->90へ移動
*/

printf("TEST 0->90\n");
for( j=0;j<=90;j=j+2){
servo(SERVO01,j);
servo(SERVO02,j);
}
usleep(WAIT_TIME);

/*
90->180へ移動
*/
printf("TEST 90->180\n");
for( j=90;j<=180;j=j+2){
servo(SERVO01,j);
servo(SERVO02,j);
}
usleep(WAIT_TIME);


/*
180->90へ移動
*/
printf("TEST 180->90\n");
for( j=180;j>=90;j=j-2){
servo(SERVO01,j);
servo(SERVO02,j);
}
usleep(WAIT_TIME);


/*
90->0へ移動
*/
printf("TEST 90->0\n");
for( j=90;j>0;j=j-2){
servo(SERVO01,j);
servo(SERVO02,j);
}
usleep(WAIT_TIME);
}
return 0;
}
------------------------------------------------------------------


2014年2月27日木曜日

raspberry piのLANの無線化 その2

前回無線接続が上手くいかなかったので
もう一度設定見直し

無線LANに接続するための設定ファイルは2つ

/etc/wpa_supplicant/wpa_supplicant.conf

/etc/network/interfaces


まずは
/etc/network/interfaces
から

以下の記述が追加されていることを確認

#Wireless lanの0番目に対する設定の追加
auto wlan0
allow-hotplug wlan0

#マニュアル設定からDHCPへ変更
#iface wlan0 inet manual
iface wlan0 inet dhcp

#無線LAN設定の参照先?
#もともと有るのはコメントアウト
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

次に
/etc/wpa_supplicant/wpa_supplicant.conf

以下赤字の部分が今回設定した部分

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP
scan_ssid=1
ssid="SSID名"
psk="暗号キー"
}

うまくいかないと思っていたら・・・・無線AP側の設定がWPA2になってた
最終的にファイルを以下のように修正したら無事接続完了

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    proto=WPA WPA2
    key_mgmt=WPA-PSK
    pairwise=CCMP TKIP  scan_ssid=1
ssid="SSID名"
psk="暗号キー"
}


2014年2月25日火曜日

raspberry piのLANの無線化 その1

今日はraspberry piのLANの無線化に挑戦
手元に余っていたUSBの無線LANデバイスGW-US54Mini2を使う

raspberry pi 起動中にすとraspberry pi の再起動が起きる
挿してからきどうするととりあえず安定

$ lsusb
で認識を確認






正常に認識しているようだ。

$ ifconfig
でネットワーク識別状態を確認





すでにwlan0として認識している

あとはアクセスポイントと通信出来るようにすればOK・・・のはずだがうまくいかない。
明日もうちょいがんばろう



2014年2月20日木曜日

raspberry piでPUSH SWのセンスをやってみる

本日はraspberry piでPUSH SWのセンスをやってみる


【ソフト】
raspberry piのGPIO17を入力にして
1s周期でセンス
ターミナルの標準出力へ結果を出力

【ハード】
SW押下時に GPIO17にLが入力されるように
3.3VにPullUpしておき、SW押下時にGNDとつながるように構成

【結果】
 思い通りにできました。 SWを検知してHALTが実行できるようにしたいなぁ。












test.c
------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include "BCM2835-ARM-SFR.h"

/* pin番号の定義 */
#define SW_PORT_NO   17

//  gpio[n]: GPIO 関連レジスタ (volatile=最適化によって消滅させない→必ず実メモリにアクセスさせる)
static volatile unsigned int *gpio;

//  gpio_init: GPIO 初期化(最初に1度だけ呼び出すこと)
void gpio_init ()
{
    int fd;
    void *gpio_map;
    //  /dev/mem(物理メモリデバイス)を開く(sudo が必要)
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1) {
        printf("error: cannot open /dev/mem (gpio_setup)\n");
        exit(-1);
    }
    //  mmap で GPIO(物理メモリ)を gpio_map(仮想メモリ)に対応づける
    gpio_map = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, GPIO_BASE );
    if ((int) gpio_map == -1) {
        printf("error: cannot map /dev/mem on the memory (gpio_setup)\n");
        exit(-1);
    }
    //  mmap 後は不要な fd をクローズ
    close(fd);
    //  gpio[index]: 整数 uint32 の配列としてレジスタへのアクセスを確立
    gpio = (unsigned int *) gpio_map;
}
//  gpio_configure: ピン機能を設定する(ピンを使用する前に必ず設定)
//      pin : (P1) 2,3,4,7,8,9,10,11,14,15,17,18,22,23,24,25,27
//            (P5) 28,29,30,31
//      mode: GPIO_INPUT, _OUTPUT, _ALT0, _ALT1, _ALT2, _ALT3, _ALT4, _ALT5
void gpio_configure (int pin, int mode)
{
    int index;
    unsigned int mask;

    //  ピン番号チェック
    if ((0 <= pin) && ( pin <= 31 )) {
   //  レジスタ番号(index)と3ビットマスクを生成
   index = pin / 10;
   mask = ~(0x7 << ((pin % 10) * 3));
   //  GPFSEL0/1 の該当する FSEL (3bit) のみを書き換え
   gpio[index] = (gpio[index] & mask) | ((mode & 0x7) << ((pin % 10) * 3));
    }
else{
        printf("error: pin number out of range (gpio_configure)\n");
        exit(-1);
    }
}
int gpio_get (int pin)
{
int tmp;
int result;

    //  ピン番号チェック(スピードを追求するなら省略してもよい)
    if ((0 <= pin) && ( pin <= 31 )) {
    result = ( gpio[SFR_INDEX_GPLEV0] >> pin)& 0x00000001;
    }
else{
result = GPIO_LEVEL_L;
        printf("error: pin number out of range (gpio_set)\n");
        exit(-1);
    }

return result;
}
int main ()
{
    unsigned long int level;

    gpio_init();  /* アドレス空間を周辺ペリフェラルのアドレスにマッピング */

    gpio_configure(SW_PORT_NO, GPIO_INPUT); /* ポート動作モードを設定 */

    while (1) {
    level = gpio_get(SW_PORT_NO);
    printf("Level:%1d\n",level);
    usleep(1000*1000);
    }
    return 0;
}
------------------------------------------------------------------------------

2014年2月19日水曜日

raspberry pi に webカメラを繋いでみる

今日はrasberry piにwebカメラを繋いでみる

つなぐカメラは普段Skype用につけている
ELECOM UCAM-DLE300T

とりあえず指して認識しているか確認
pi@raspberrypi ~ $ lsusb







ちゃんと認識しているようです。

webでググると監視カメラとして使うためのMotionというソフトウェアがリポジトリにあるようなのでインストール

pi@raspberrypi ~ $ sudo aptitude install motion

インストールしたら動かすための
設定ファイルを編集

pi@raspberrypi ~ $ sudo vi /etc/motion/motion.conf

# Start in daemon (background) mode and release terminal (default: off)
daemon off
daemon on

# Restrict webcam connections to localhost only (default: on)
webcam_localhost on
webcam_localhost off

pi@raspberrypi ~ $ sudo vi /etc/default/motion
# set to 'yes' to enable the motion daemon
start_motion_daemon=no
→start_motion_daemon=yes

これで準備完了。
起動
pi@raspberrypi ~ $ sudo service motion start

さて、Webブラウザから見えるらしいので、やってみる
http://(raspberry piのIP):8081/

あれあれ、何も映らない・・・・。

・・・ぐぐってみる・・・

どうやら動画の形式がmotion JPEGで、
chromeでURLじか指定してもは見れないようです。

しかたがないので下のように
htmlファイルを作成してその中のimgタグで指定

picamera.html
---------------------------------
<html>
<body>
<img src="http://raspberrypi.local:8081">
</body>
</html>

---------------------------------

見れました!!