2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

Raspberry Pi

2015年10月 5日 (月)

raspberry pi2にubuntuをインストールする

RaspberryPi2へのubuntu14.04インストールを試した。
ubuntuといえばバリバリのデスクトップ用であるがpi2になってパワーアップしたことで入れられるようになった。しかしここで試したubuntuのイメージファイルはXserverが入っていなかったので欲しい人は別途入れるか、すでにXserverが入っているイメージファイルを探さなければならない。

具体的な手順

DDwindowsではうまく行かなかったので、diskImager32winのほうで試した。
DDのなにがよくないのかは不明。
参考サイト

このファイルを解凍すればimgファイルが入っている。
必要なのはこのファイルだけ。
Download 2015-04-06-ubuntu-trusty.zip
diskImagerで書き込んで、それをラズパイに入れて電源を入れれば起動する。
起動するとCUIの画面が出てくるだけ。


SSHをインストール
sudo apt-get -y update
sudo apt-get install -y openssh-server

を使えばうまく行った。

開いているポートを調べるコマンド
netstat -l

でSSHの項目があればログインができるはず。

IPを固定せずDHCPで運用したい場合はavahiデーモンを入れる。
※ubuntuではデフォルトで入っているようなのだが、このイメージでは入っていない。
apt-getでインストールすれば直ぐに使えるようになる。

sudo apt-get insatall avahi-daemon
というコマンドだけで動くようになった。




2015年7月 8日 (水)

C# シリアルポートを使う フォームプログラムでラズベリーにシリアルを送るツールを作る。

C# シリアルポートを使う フォームプログラムでラズベリーにシリアルを送ってみた

YoutubeのC#講座で何か作りたくなったら試してみる価値のあるテーマ

まずフォームの作り方から、
ボタンを一個配置する。画面左端にあるツールボックスという目立たないボタンをクリックする。

  
最初はわかりにくい・・・。


シリアルポートは、ツールボックスのコンポーネントという項目に入っているので、
それもフォームにドラッグアンドドロップする。

フォームデザイナのフォームと、ボタンをそれぞれダブルクリックして、
Form1_Load、button1_Clickという関数を追加する。

Form1_loadの中に、
InitializeComponent();
serialPort1.Open();

をいれて、あとはbutton1_Clickに
シリアルで送りたいものを書くだけ。
ボタンを押せばそれが送られる。

myData = new byte[4];
myData[0] = 65;
myData[0] = 65;
myData[0] = 65;
myData[3] = 0x0a;
serialPort1.Write(myData, 0, 4);

これでOK。
注意:最後のバイトを改行コードにしておかないと、ラズベリーで受信終了がわからないので抜かさないように。

再びフォームデザイナに戻って、
シリアルポートのプロパティを開く。

BaudRate(ボーレート)とPortName(COM番号)が指定できる。他はまったくデフォルトのままで良い。USBシリアルを使うなら、デバイスドライバが入っているのを確認して、デバイスマネージャでCOM番号を調べる。

次はラズベリー側

シリアルが使えることを確認してから、下記ページに従いボーレートなどを設定。
linuxでシリアルを使う

ラズベリー側デフォルトでは改行が来るまでは画面に出さない設定になっているので、
PC側は必ず最後に改行を送るようにする。

ラズベリーで、
cat < /dev/ttyAMA0
と打てばシリアル受信待ちになる。

C#のプログラムのボタンを押せば、
先ほど記述したデータがラズベリーで受信できるはず。


マニアック情報
秋月のUSBシリアルモジュールのほうが若干安いけどピンヘッダは1列で丸ピン。一方デジットのやつは付属のピンヘッダのピンが角型なので、ラズベリーで使っているジャンプワイヤがそのまま使える。丸ピンだとスカスカで刺さらない。

TX,RX,GNDの3ピンだけ上に出して、メスーメスのジャンプワイヤでラズパイと接続するのがいい。




2014年11月16日 (日)

RaspberryPiの図面 基板の寸法 固定する板の製作

RaspberryPiを固定する板を製作するために寸法取りをしたのだが、ノートに書いてほったらかしだと勿体無いのでCAD図面に起こしておいた。
前のTypeBバージョンではあるのだけれど、いちおうシェアします。

Ws000033

本体の図面
RaspberryPiの穴の位置、コネクタの位置やSDカードの出っ張りなど参考になれば。
スチールの定規で測ったので、そこそこアバウトではあります。あしからず。
「raspberrypi.pdf」をダウンロード


ラズベリーを固定する板の図面。M3のビスで板の両端をビス止めする。
「raspPlate.pdf」をダウンロード

ラズベリーと固定板の図面元データ
「raspPlate.dwg」をダウンロード

DWGファイルを読み書きできるCADソフトとして、DraftSightというフリーソフトウェアがある。
AutoCadと操作がそっくりでいて、動作は非常に軽快。

最近のAudoCadは共有機能や3D機能がゴテゴテと付加されて重いのだが、該ソフトは無駄が無いしとてもシンプル。

他にもフリーのCADを色々試したのだが、
Jw_CADはすでに使い慣れたAutoCadと操作がだいぶ違うし、あんまり自分の手になじまず。
RootProCadもイマイチ手になじまなかった。結局AutoCadに染まりすぎたのだろう。




2014年10月13日 (月)

ラズベリーでシリアルを動かすときの手順書 <<まとめノート>>

ラズベリーパイとPCをつなぐときの手順を、トラブルシュートもあわせてまとめた。
linux上でシリアルを使うときにも参考になるかも。


これからやること。
ラズベリー(typeB初期型)を送信端末。PCのcygwinなりあくのりっちを受信端末として設定する。文字列をラズベリーから送って、PCで受信できるようにする。

↓PC側のシリアル基板として、下記を使った。
USB to SERIAL変換 FT232RL使用 デジット シリアル基板

<<作業手順>>
1.
まず、ラズベリーとシリアル基板を接続。
ラズベリーのシリアルピンは下記2本。

つなぎ方は、クロス方式で、
ラズベリーのTX→シリアル基板のRX
ラズベリーのRX→シリアル基板のTX

2.
シリアル基板のGNDと、ラズベリーのGNDを接続。
これを忘れやすい。

3.
シリアル基板のロジックレベルを3.3Vに設定。
5Vのままだと基板が壊れる。
設定方法は、JP1のジャンパを5とかかれたシルクの側から3側に付け替えるだけ。

なお、TX,RXのラインに2kの抵抗をつけておくと故障防止になる。
・基板TX→2k抵抗→ラズパイRX
・基板RX→2k抵抗→ラズパイTX

4.
シリアル基板をUSBに接続し、
デバイスマネージャでCOMの何番になったか確認する。


5.
ラズベリー側の設定
まず通信ボーレートの設定から。
stty -F /dev/ttyAMA0 9600

6.
PC側の設定
cygwinで試す場合は、デバイスファイルとして
COM10→/dev/ttyS9 を使う。番号が一個小さいことに注意。

ボーレートの設定は、ラズベリーと同じ。
stty -F /dev/ttyS9 9600

7.
双方の設定が完了したら、PC側を受信待ち状態にする。
あくのりっちを立ち上げて、COM10をオープンする。
cygwinでやるなら、
cat < /dev/ttyS9

8.
ラズベリーから送信
echo "hello" > /dev/ttyAMA0
このコマンドを実行すれば、実行した回数だけPC端末上にラズパイからの文字列が表示される。

cygwin上で受信したときの様子。
$ cat < /dev/ttyS9
hello
hello
hello

トラブルシュート
Q:cygwin上でシリアルをオープンしようとすると、permission deniedとエラーが出る。
A:/dev/ttyXXのファイル自体にパーミッションがないわけではなく、単に他のソフトでそのポートをすでにオープンしてしまっていることが多い。ほかのアプリケーションでシリアルを使っていないか確認する。自作でシリアルポートをオープンするプログラムを走らせて、オープンのままにしているケースもあったりする。

Q:設定は正しくやったのに、何も表示されない。
A:GNDラインは接続したか。TX/RXの接続は正しいか。送受信しているデバイスファイルの選択は正しいか。COM番号を間違っていないか。

Q:表示が変。送った文字列がきちんと表示されない。
A:シリアル基板のロジック電圧設定は正しいか(手順3を確認)。ボーレートの設定は送受信双方であっているか。ボーレートの確認は、
stty -F /dev/ttyXX
でできるが、そもそもttyXXの番号を間違っていては何にもならない。


キーワード:
Raspberry serial シリアル UART cygwin linux

2014年8月22日 (金)

Ruby HTTPサーバーを理解するには、CGIの使い方に慣れる

CQ出版 インターフェース誌のラズベリーパイでIOサーバーを作る記事を元に、
このあいだ作ったサンプルのなかで、
理解していなかったタグがある。

<form action = 'view.cgi' method = 'POST'>
<input type="submit" name="exec" value="SUBMIT">



とほほさんによると、
input type="submit"
formタグのactionで指定したアクションを呼び出す。とある。


そもそもフォームとは??
GUIの入力フォームを表示するもの。formタグの中に<input>などのボタンやテキストボックス、チェックボックスを配置する。

このformタグの中にはinput type="submit"の要素を一個だけ持ち、
これが実行されることにより
method 属性に指定した転送方法(HTMLサーバーにデータを要求する手段、GETかPOSTか)で、action属性に指定したメソッド(関数)を呼び出す。

つまり、action='view.cgi'となっているから、
Webrickのサーバーの中でview.cgiにmountされたview.rbが呼び出される。

CGI 処理の流れは、
1.WebブラウザがWebサーバにGETかPOSTでデータを要求する。
GETはURLをサーバに投げることでデータを要求する。丁度Googleに検索キーを投げるときに使われる。Amazonの書籍検索なんかもこれ。
POSTはファイルのアップロードとか、大きなサイズを投げるのに使われる。

2.WebサーバはCGIプログラムを実行する。
ここを、Webrickで作っている。Webrickのセッティングの中で、どのプログラムを実行するかを指定しているのだ。

3.CGIプログラムでHTML要素が書き換えられる。

今のWebrickのサンプルプログラムの状況でいうと、view.rbがHTMLソースを吐き出すことで、ページが表示される。

4.Webブラウザが、サーバが書き換えたHTMLを読む。


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

つまりは、
view.cgiはWebrickサーバーの中でview.rbと紐付けされ、
view.rbが実行される。

これはもちろん、起動するCGIがRubyに限ったものではないのか、と思い、
ためしにPerlスクリプトを起動させるサーバーを作ってみた。


Webブラウザから来るview.cgiという要求を、Webサーバーでview.plに紐付けすればよいから、マウントの部分の最後を、

s.mount('/view.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.pl')
とする。

このマウントというやつを複数設置できるかどうかやった。


変更点は、

index.htmlファイルに、form actionタグを一個追加。
    <form action = 'view.cgi' method = 'POST'>
     <input type="submit" name="exec" value="SUBMIT"></form>
    
     <form action = 'view2.cgi' method = 'POST'>
     <input type="submit" name="exec" value="SUBMIT"></form>



server.rbファイルに、s.mountを一個追加。

s.mount('/view.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.pl')
s.mount('/view2.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.rb')



これで、HPの上のボタンを押すとPerlスクリプトが、
下のボタンを押すとRubyスクリプトが実行できるようになった。

しかし!!!
サーバーは拡張子で、ファイルの中身がperlかrubyか認識することはできないらしく。
Perl独自の書き方をすると、Rubyファイルがない!!と怒られてしまった。

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

Perlをインタープリタに指定すればPerlスクリプトと連携できる?!
ここを参考にやってみました。

いまさらRuby on Rails を使ってサーバーを作るのは大変。
情報がたくさんあるPerlスクリプトがWebrickから使えれば少しは楽になる。
 
server.rbの中のHTTPServer.newのところで、

:CGIInterpreter => 'C:\Perl64\bin\perl.exe'
WinPCの場合はディレクトリの記号は¥なので、これに注意

Perlの実行ファイルを指定する。
これで、このCGIから呼び出すスクリプトはPerlが使える。




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


これをみればactionタグの動作例がわかる。

このページの
最初の例の、文字列を送るを試してみれば、
どんな動きをしているかがわかる。

フォームのテキストボックスに、"Hello"と打ち込んで、
送るボタンを押すと、Webブラウザのアドレスバーがこんな表示に変わる。
http://www.ipc.hokusei.ac.jp/~z00104/cgi-bin/test1.pl?param=Hello

※ページには飛ばない。

アドレスバーの最後のところにparam=Helloがくっついている。
おそらくperlへの値渡しだ。

method='get'
使っているメソッドはget。

それを見た上で
これを見れば、ようやくactionタグがやっていることが理解できる。


送信データがURLの一部としてサーバーに送信されることで、
サーバーはそれを受け取って、応答を返すというものだ。

アドレスにくっつけて渡すのがGET。
GETは255文字までという制限がある一方、
新しくPOSTというのが策定された。

GETとPOSTで扱い方を変えなければいけない。
受け取り方が異なるからだ。

たとえばこんな風にする。サーバーサイドはPerlの例が多い



2014年8月21日 (木)

Rubyによるhttpサーバー実験 IOサーバー実験 Raspberry Pi

Rubyによるhttpサーバー実験をRaspberry Piで!!

第7章 ブラウザからの動的IO制御にトライ (インターフェース CQ出版)
を参考に、ラズベリーでWeb経由のIO制御をやろうとした。

Webにアクセスできるスマホやタブレットから、ラズベリーパイで作ったHTTPサーバーにアクセスし、ラズベリーのIOを操作しようというもの。

IOに何をつなぐかによって用途が色々考えられるし、
なによりスマホからラズベリーを操作できるというのが面白い。

しかしながら、本のソースをそのまま打ち込んでも、中々上手くいくものではない。
見た目より相当難しかったのだ。
個人でも色々できるようなツールが進化した!といえども、やはり背景に使われている技術の勉強なしにはサンプルプログラムさえまともに動かせない。

少なくともHTMLの仕組みと、このサンプルに使われているGUIやCGIについてぐらいは勉強が必要だ。GUIについては別ページで詳しく説明を書いたので参考にされたし。



ラズベリー上で、

ruby httpser.rb
を実行。

サーバーが立ち上がったら、wifiアダプタのアドレス192.168.x.xにアクセスする。
するとpublic_htmlのform.htmlファイルに設定したHPが表示される。

---------

ここで、portを80番にして、特殊なポート番号の指定なしにform.htmlを表示させようと思った。しかし、このポート番号にするとエラーが出る。

[2014-06-02 23:54:57] INFO  WEBrick 1.3.1
[2014-06-02 23:54:57] INFO  ruby 1.9.3 (2012-04-20) [arm-linux-eabihf]
[2014-06-02 23:54:57] WARN  TCPServer Error: Permission denied - bind(2)
/usr/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Permission denied - bind(2) (Errno::EACCES)
        from /usr/lib/ruby/1.9.1/webrick/utils.rb:85:in `new'
        from /usr/lib/ruby/1.9.1/webrick/utils.rb:85:in `block in create_listeners'
        from /usr/lib/ruby/1.9.1/webrick/utils.rb:82:in `each'
        from /usr/lib/ruby/1.9.1/webrick/utils.rb:82:in `create_listeners'
        from /usr/lib/ruby/1.9.1/webrick/server.rb:82:in `listen'
        from /usr/lib/ruby/1.9.1/webrick/server.rb:70:in `initialize'
        from /usr/lib/ruby/1.9.1/webrick/httpserver.rb:45:in `initialize'
        from httpser.rb:5:in `new'
        from httpser.rb:5:in `<main>'

bindのパーミッションが拒絶されているようだ。理由はよくわからん。
動いたのでよしとする。

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

Rubyマガジンというページがあり、Webrickの用例について参考になる。

Rubyを使ったCGIサーバーの作り方。わかりやすい。
webrickを使ったサーバが用意されていて、すぐにCGIが体験できる。
RDE開発環境は、試してみたが正常に動かなかった。

<色々やってみて気づいたポイント>

処理の流れはこうなっている。

1.
view.cgiというファイルを置いておかないといけないのではなく、
view.cgiというラベルみたいなものを呼び出している??
じつはこれ、htmlのGUIボタンの中に記述されている。
詳しくはHTMLのGUI部品の使い方にて説明。

2.
ht.rbファイルの中の、mountで、view.cgiに紐付けられたview.rbを呼び出す。

3.
view.rbがRubyスクリプトとして実行され、Webに表示される。


ちなみに、WinPC上で試す場合
------------------------------
PCでやろうとしたら、こんなことに注意する必要がある。
つまずいたポイント。
最初はview.rbのところでエラーが出た。こんなメッセージだ。
Premature end of script headers: view.rb

ポイントとしては、
:CGIInterpreter メンバを正しく設定すること。
Windowsなら、'C:\Ruby200-x64\bin\ruby.exe'
などとする。ディレクトリ記号がUNIXのスラッシュでは動かないのだ。

また、view.rbの作成にあたっては、
文字コードはUTF-8
改行コードはCR+LF
を設定する。改行コードが間違っていると、さすがに動かない。

動かし方。
1.PC上から操作する。
  まず上記Zipを適当に解凍し、

2.ht.rbファイルを実行する。
  すると、WEBRickサーバーが立ち上がる。

3.Webブラウザのアドレスバーに、
  "localhost:3000"
  と打ち込めばOK。GUIボタンが表示される。

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

<<view.rbの内容>>
色々知っていないといけない知識がちりばめられていて、挫折ポイントが盛りだくさんである。わかりそうで初見なコードについては、逐一検索で調べながらやること。

view.rbを使って、htmlファイルを作成している。
これがCGIの基本。rubyが内容を書き換えたhtmlを作成して表示することで、
毎回画面が変化するHPが作成できる。

ファイルを見ていこう。
最初に、cgiというCGIオブジェクトのインスタンスを作る。

cgi = CGI.new("html3")  # HTML生成メソッドを追加

form actionというのが、ファイルの開始。
その行から後は、文字列の連結を使っている。

m= m+"次の行の内容"

bodyに追加したい内容をひとしきり"m"という文字列変数に詰め込んだら、
こんどはhtmlをCGIオブジェクトを使って吐き出す。

cgi.body{
     m
}

ものすごく地味でわかりにくいが、"m"という文字列がbodyのなかに吐き出されるということがわかる。

動くファイル。
「tame1serv.zip」をダウンロード

動かし方。
1.PC上から操作する。
  まず上記Zipを適当に解凍し、

2.ht.rbファイルを実行する。
  すると、WEBRickサーバーが立ち上がる。

3.Webブラウザのアドレスバーに、
  "localhost:3000"
  と打ち込めばOK。SUBMITというボタンが表示される。

4.ボタンを押すと、view.rbで生成されたHTMLにより、
  チェックボックスが一個あるページが表示される。


140605
----------------

Javascriptのチェックボックスの制御を試してみた。
しかしこれが上手くいかない。
SUBMITを押すたびに、チェックが消えてしまうのだ。

ボタンの制御が何をしているかはわかるのだが、

m= m+ "<input type= \"checkbox\" name = \" 'cb7' \" value = \"ON\""
if cb == "ON"
     m= m+" Checked"
end
m= m+">:checkbox 7"
m= m+"<BR>\n"

問題はifのところに有りそう。
そう思って、ここを参考にして変数を仔細に調べた。

すると、どうやらnameのパラメータがview.rb内で変わってしまっている。
正確にいうと、htmlでチェックボックスを出力している部分で、
ボックスの名前がおかしな形になっている。

誤り
m= m+ "<input type= \"checkbox\" name = \" 'cb7' \" value = \"ON\""

正しい
m= m+ "<input type= \"checkbox\" name = \"cb7\" value = \"ON\""

これでJavascriptには"cb7"で読み込まれ、正常に作動した。

とりあえずチェックボックスの動作はこれでOK。


140605/0028
-------------

ついにラズベリーに実行ファイルをいれて実験。
ところが、またview.rbでコケタ。

この状態まで一旦ミニマイズすると、動くことは確認できた。

#!/usr/bin/env ruby
が問題なのかと思ったが、そうでもないらしい。

問題はこっちだった。
print "Content-Type: text/html\n\n"

これを抜かしたときだけエラーが出る。最初で躓いていたのだ。
??しかしこれが入っていると、後のCGIのインスタンスが出力できない様子。
やっぱり本のソースが正しい。

ふと気づいたが、ioLibというのは、この本で製作したオリジナルのライブラリだから、標準でインストールされていないのだった!!

ほかのライブラリを使うことに。wiringpi

rpi# apt-get install -y ruby-dev 
rpi# gem install wiringpi 

これで使えるようになった。

sudoでないとwiringpiでパーミッションエラーが出る。
とりあえず動いているみたいだ。

ところがGPIOはウンスン。
GPIO7でだめだったから1にしてみたが、やはり変化なし。
一旦個別でwiringpiが機能しているかから確認したほうがよさそうだ。



140605/1900
-----------------
GPIOの試しから。結局、wiringPiのピン配を間違っていた。
GPIO1は、右の列の上から6番目だった。間違って7番目につけていた。

あと、1・0ではなく、ハイ・ロウは定数が定義されているらしい。

ソース参考

この書き方もできる。

B+??、新しいラズパイ!?

無線LANの設定方法についても解説しています。
解説はこちらから。






2013年12月31日 (火)

Raspberry Piにプレステのコントローラをつなぐ SPIの詳細な利用方法

RaspberryPiをミニゲーム機に仕立て上げるべく、プレステのコントローラをつなぐことにした。

Evernote_snapshot_20131231_211620
我が家のタンスの中にしまいこまれていたPS1のHORIパッド。
捨てる前に!!


プレステのコントローラ(以下PSパッド)は、SPI通信でボタン情報を読み出せるようになっている。通信フォーマットや動作波形の様子は別途このページを参照されたし。

PSパッドは通信フォーマットの解説にあるとおり、LSBファーストでバイトを送信しなければならない。またクロックの位相も、前回wiringPiという便利ライブラリを使った時とは違っているので、いちいち指定してやらなければならない。そこで今回は、wiringPiライブラリを使わずに、linuxプログラミングでより詳細な設定を利用する。



一番参考にしたのがこのソースで、
raspberryのSPIに設定できるオプションを全て試せると思った。
大抵の英語サイトも上記のリンクを参考にしていた。


ここではまず、PSパッドを使おうとする上で最も重要な、ビットオーダーをひっくり返すオプションを指定したい。ソースの76行目に"-L"を指定せよとある。
"  -L --lsb      least significant bit first\n"

コマンドラインでこんな風に打ち込んだ
$ ./spidev_test -D /etc/spidev1.1 -s 100000 -L

ところがまともに実行できない。
ソース中に書いてあるオプションを試してみたのだが、speedとdeviceしか受け付けてくれない。キー入力されたオプションを読み込むらしき部分は

c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);

となっているので、オプションの指定の順番があるような気がしてきた。そこで、オプションの入力の順番、-Lを最初のほうに入れ替えてみた。

しかし上手くいかない。
このエラーが繰り返し出てくるだけであった。
can't set spi mode: Invalid argument


コマンドライン引数からのオプション指定が上手くいっていないのだと思い、ソースを一旦消して、modeという変数に直接数値を入れるように書き直してみた。しかしこれも上手くいかず。どうもSPI_LSB_FIRSTというオプションが定義されていないのだろうか。

uname -a

でカーネルのバージョンを調べてみたが、3.6.11だったのでこれは最新で問題なし。

-----

ずばりPS2のパッドを使おうとしている人のページを発見。
しかしハードでやるのをあきらめて、ソフトでやっている。。。
ビットの順序逆転についてはあまり調べなかったが、この人はテーブル参照方式とやらを使っているらしい。

-----

同じソースをベースに書いているが、ちょっと変えてあるページを発見。
defineのところで一括して指定するらしい。
掲載されているC言語の文法がなんだかおかしい。コンパイルが通らず・・・。

-----


ラズベリーの仕様書や使い方が載っているこのページを見ると、
SPIクロックのスピードについて。サポートしているスピードはUARTと同様決まっているとある。そして決まった周波数以外を指定すると、規定の周波数のなかで指定した周波数より低いものが自動で選択される。

しばらく見ると、Supported Mode bitsという項目があり、クロックのフェーズについてと、CSの扱いについてのもの。下記4項目しかかかれていない。ということはこれ以外のオプションはRaspberryではサポートしていないということか??

    * SPI_CPOL - Clock polarity
    * SPI_CPHA - Clock phase
    * SPI_CS_HIGH - Chip Select active high
    * SPI_NO_CS - 1 dev/bus, no chipselect



これら4つのオプションを全て試したところ、確かに実行することができた。

pi@raspberrypi ~/TameshiSpace/131230 $ sudo ./spidev_test -s 100000 -D /dev/spidev0.1 -HOCN
spi mode: 71
bits per word: 8
max speed: 100000 Hz (100 KHz)

FF FF FF FF FF



そして、これ以外のオプションについてはどれもInvalid argumentのエラーが出た。つまりそれらのオプションはおそらく、ヘッダで宣言されてない。

サンプルソースを見て、LSBファーストを指定できるのかと思いきや、対応していないことがわかった。

broadcomのARM-peripherals.pdfを見てみたが、LSB firstについてはどうやら見当たらなかった。ハードが対応していなかったらしい。
linux全般で調べてしまうとまずいこともあるということか。


-----

ようやく、

SPIが使えるようになったので、PSパッドをつないだ。

PspadPspadpin_2

このソースが半完成品。
「spidev_ps.c」をダウンロード

実行すると、こんな感じでパッドからデータが返ってくる。

pi@raspberrypi ~/TameshiSpace/131230 $ sudo ./spidev_ps
spi mode: 3
bits per word: 8
max speed: 61000 Hz (61 KHz)

FF 82 5A FF FF

RaspberryのSPIではLSBファーストのオプションが使えなかったので、とりあえず手計算でビットを逆順にして送信し、パッドからのIDを受け取れるようにした。

注意: トラブルシュート
もしこの時点で00しか出てきてなかったら、DATのプルアップを付けたか確認する。
DATだけオープンドレインなので注意。


いつもなら、下記のバイト列をLSBファーストで送る。
0x01,0x42,0x00,0x00,0x00

手動でLSBファーストに書き直して、ソース内の送信バッファに書き込んだ。
0x80,0x42,0x00,0x00,0x00

するとパッドからの返答が、
FF 82 5A FF FF
で返ってくる。

これをLSBファーストに書き直すと、
FF 41 5A FF FF

ノーマルパッドは0x41が返ってくるはずなので、パッドのIDが正しく読めていることが確認できた。下は動作させたときのDATピンの波形。

Ws000091

このラズベリーに小型液晶を接続すれば、ちょっとしたゲーム機が作れそう。プレステのエミュレータをインストールすれば本当にミニ版PSが作れる。

注意: トラブルシュートおさらい。

・SPI通信の結果が全バイトが0x00だったら、DATのプルアップを付けたか確認する。
DATだけオープンドレインなので注意。
・SPIを使うには、linuxの設定ファイルの書き換えが必要。lsmodでデバイスドライバがロードされているか確認する。
・デバイスファイルにアクセスするプログラムは、sudoがないと実行できない。さらにwiringPiライブラリを使った場合は"gpio load spi"というコマンドが必要。





電子工作 ブログランキングへ

2013年12月30日 (月)

Raspberry PiのSPIを使う。wiringPiを使った方法。

ここを読んで試した。

まずはポートを有効化する。
指定の設定ファイルを編集しなければならない。そのファイルがこれ。
/etc/modprobe.d/raspi-blacklist.conf

これの、3行目にあるblacklist spi-bcmの行をコメントアウト。一行目は違う。
Piには0と1の2chのSPIがついている。

ソースコードの準備>>

ライブラリを使ってやるなら、GordonProjectのwiringPiを使うのが手っ取り早い。
設定項目が絞られているのでコード量が減らせる。

尚、wiringPiを使うときは、コマンドラインで最初に
gpio load spi

というコマンドを実行する必要がある。これは起動のたびにやらなければならない。
そうしないと、こんなエラーが出る。
Unable to open SPI device: Permission denied

ピン配置について>>
ここに詳細が載っている。

CE(chip enable)についてもポートがある。
CE0につなぐ場合は24pin.GPIO8。
CE1の場合は26pin.GPIO7につなぐ。
0を使うか1を使うかは、spiの初期化のときに指定する。

メモ:
コンパイル時に、wiringPiのライブラリファイルをインクルードしなければエラーで通らない。
”userFile.c”というファイルをコンパイルしたければ、

gcc -lwiringPi userFile.c

のようにする。"-l"がリンク指定のオプション。

CommentsのところのAlan氏の投稿にあるソースを写して実効してみたら、
文字列を入力するとそれに対応したバイトがSPIから出てくる。
しかし、なぜかASCII文字列コードしか出力できないので、このままではPSパッドには使えない。どちらかといえば、Hexで指定した値を出力できるようにしておきたい。

解決方法はこれ
stdint.hをインクルードした上で、uint8_t型でbuff[]を宣言する。

ここのソースがそうなっていた。
uint8_t型で作り直したのが「wiringSPI2.c」をダウンロード

そしてこれが動作中の波形。MOSIから1,2,3を出力。
Ws000090

wiringPiには、クロックの位相やcsの立下りタイミング、ビットオーダーの反転を設定することが出来ないようなので、PSパッドを動かしたいような場合はC言語で全部の設定を書いていく必要がある。


2013年11月26日 (火)

Raspberry Piのネットワーク設定例 クロスケーブルでPCと一対一接続する方法

Raspberry Piの設定をするときにいちいちモニターとキーボードとマウスを用意するのは手間がかかる。そこで、有線LANでPCと一対一でつなげば、いつでも同じ条件でSSHログインできるようにしておくと安心。

以下設定例について記載。

注意
普通の「ストレート」LANケーブルでPCとつないでも全く通信できない。このままではラズベリーとPCの、送信と送信。受信と受信の信号がぶつかってしまうからだ。
クロスケーブル変換器を買ってくる必要がある。買ってくるのが面倒なら、LANのケーブルを途中で切断して、信号線TX,RXを入れ替えてクロスケーブルを自作するのもいい。



↑LANクロス変換アダプタ。
PCパーツ屋さんのサプライコーナーなどで売っている。500円くらい。

<PC側の設定>

有線LANのクロスケーブルでPCと直接つなぐときは、PC側のネットワークアドレスを固定しなければならない。
win7では、ネットワークと共有センター→ローカルエリア接続→プロパティ→インターネットプロトコルバージョン4→プロパティ

次のIPアドレスを使うにチェックを入れて、
PC側の有線LANアダプターのIPアドレスを
address : 192.168.10.3
netmask : 255.255.255.0

と設定。

Ws000010

※自分なりの解釈では、
これでネットワークアドレス192.168.10.xxxのなかの3番地にPCが割り当てられる。


<Raspberry Pi側の設定>

設定に当たっては、
/etc/network/interfaces
のファイルを書き換える必要がある。

すでにLANを使っている場合は、上記ファイルを開くときに警告が出る。
無視して書き換えた場合は、設定ファイルを反映するためにネットワークアダプタを一旦停止してから、もう一度起動する必要がある。アダプタがeth0のとき、そのときに使うコマンドが

sudo ifup eth0  ←ネットワークアダプタ一旦停止
sudo ifdown eth0
  ←ネットワークアダプタ起動

の2つ。このあと、ifconfig でeth0が指定のIPアドレスになっていればOK。
すでにeth0が動作中のときにifupしたら、already configuredなどとエラーがでる。

ファイルの書き方については、いろいろなHPを見ながら書き写した。
筆者が参考にしたHP
が詳しかったので参考にされたし。

静的IPアドレスの項。

IPアドレスは、下記のように設定する。
address : 192.168.10.10
netmask : 255.255.255.0

※自分なりの解釈では、
これでネットワークアドレス192.168.10.xxxのなかの10番地にRaspberryが割り当てられる。

追記:トラブルシュート

同じネットワーク内にIPアドレスは1個です。
PC側に192.168.10.10を割り当てたなら、raspberryPi側は192.168.10.10以外のIPを当てないといけません。

接続する機器同士のネットワークアドレスは同じにしないといけません。
PCが192.168.10.10(サブネットマスク:255.255.255.0)なのに
raspberryPiが192.168.0.10(サブネットマスク:255.255.255.0)だと、
PCとraspberryが別々のネットワークに居ることになります。

この辺のネットワークの設定は、用語の意味がわからなければ専門の本などで基本を知ってからやったほうがいいです。急がば回れ。

後々ネットワークを使う工作をするときに役に立ちます。最近はGalileoやらFlashAirやらネットを使う機器も増えたので、知ってて損はないです。







2013年10月16日 (水)

Raspberry PiのGPIOをPythonで動かす。

Raspberryに標準搭載のPythonを使ってGPIOを動かす。

まずはソース。
「tameGPIO.py」をダウンロード

手順
1.GPIO25のピンにLEDをつなぐ
2.root権限でこのスクリプトを実行する。
  $ sudo python tameGPIO.py

今度はスイッチをつないで、その結果をコンソールに表示させる。
スイッチをつける時、入力が安定するようにプルアップ抵抗をつける。しかし外付け部品は減らしたいので、内臓プルアップを使えるように設定をする。 <情報元

「tameGPIO_pud.py」をダウンロード

ミソはここ。
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.INまでならば、PULLアップは設定されない。