町工場の社長さん日記

町工場の社長さん日記

こう見えても、いろんなこと考えてるのよ~
そんな感じで、勝手に書かせてもらいます(^^)

Amebaでブログを始めよう!
何年か前、これで読売ファン復帰か?

とか言ってましたが、今ではすっかりベイスターズファンです苦笑

という訳で




来てしまいましたよ爆笑

明日から楽しみだ❗😄
ソース解析は置いておいて、シリアル通信に挑戦してみた。
 
ラズパイちゃんのUSBにUSB-RS232C変換を付けて、PCのターミナルと通信してみる。
 
先ずは、環境を整えないといけない。
 
といっても、シリアルのパッケージをインストールするだけ。
 
「sudo apt-get install python-serial」
 
これだけ。実行してみると、
 
「既に入っているよ」的なメッセージが出てきたので、標準的なもののようですね。
 
さて、ソースを書きます。
 
 
ソースはなんてことはありませんね。
 
serialをimport 
 
どのシリアルを使うのか? → ここでは/dev/ttyUSB0を使う
ボーレートは? →19.2Kbps
タイムアウト時間は? → 0.5秒
 
てな感じ。このSerialでは、他にもスタート/ストップビット数や、パリティ等も設定もできるみたいですね。
 
その後、printでコンソールに「/dev/ttyUSB0」を表示させて、
 
ターミナルにwriteを使って「TEST START」を出力する。
 
後は、Readlineでターミナルから打ち込まれる文字を読取り、文字が読み取られた時だけ、コンソールとターミナルに表示する。
 
至って簡単ですね。
 
って、これだけ書くのにえらい苦労してるんです!!実は!!!
 
苦労ポイント1
各行の先頭に、余計なスペースを入れると、「余計な文字が入っているぞ!」と怒られる。はじめは何が余計な文字なんだ??と訳が分からなかったの!!
 
苦労ポイント2
インポートするオブジェクトとファイル名を同じにするとコンパイルが通らない。これも、ソースファイル自体には全く問題ないわけで、ネットで調べてようやく分かったわけ。
 
苦労ポイント3
writeにおいて、.encode()を付けてあげないと怒られる。これも、ネットで調べてようやく見つけたわけ。python2まではいらなかったみたいで、なかなか見つからなかった。python3からそうなったみたいですね。
 
で、実行すると
 
 
コンソールはこんな感じで予定通り。でターミナルの方も
 
 
こんな感じ。
 
うまくいった!!
 
ネットで調べると、python3以前の例が多く、python3で動かそうとすると、いろいろと問題が出てくるみたいですね。
 
やっぱりちゃんと本を買って勉強した方がよさそうです。
 
 
さて、週明けの月曜日、先週試したIO制御のソースコードを見てみた。
 
そもそも、Python自体を触ったことがなく、一瞬見た際には、使い慣れたC言語の開発環境を作ろうかと悩んだくらいで・・・
 
ただ、いろいろと調べていくと、Pythonはライブラリーもそろっていて、使い勝手がかなり良いみたいなので、ここは我慢して慣れようと。
 
さて、ソースを眺めると
 
「def」で関数を宣言するようだ。
 
で、ソース内に含まれる関数は以下の通り。
 
init, bigin, home, clear, setCursor, noDisplay, display, noCursor, cursor, noBlink, scrollDisplayLeft, scrollDisplayRight, leftToRight, rightToLeft, autoscroll, noAutoscroll, write4bits, delayMicroseconds, pulseEnable, message
 
と、沢山定義されている。
 
実際の実行系は
 
if __name__ == '__main__':
 
  lcd = Adafruit_CharLCD()
 
  lcd.clear()
  lcd.message("This is a test!")
 
だけだから、せっかくいろいろと機能があるのに、サンプルではmessageしか使っていないようだ。
 
initでは
  def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 27, 22], GPIO = None):
 
となっている。selfというオブジェクトを定義して、その後にGIPO番号を変数名で定義しているようだ。
 
pin_rs=25で、「pin_rsはGPIO25だよ」という事。
pins_db=[23, 17, 27, 22]で、「pins_dbは、GPIO23、17、27、22だよ」という事。
 
配列みたいな形で定義できるんですね。
 
その後
 
    self.GPIO = GPIO
    self.pin_rs = pin_rs
    self.pin_e = pin_e
    self.pins_db = pins_db
 
で、オブジェクトとピン番号をリンクさせているみたいです。
 
C言語のように、オブジェクトの内容を構造体を定義のようにしなくてもいいんですかね?
 
次に
 
    self.GPIO.setmode(GPIO.BCM)
    self.GPIO.setup(self.pin_e, GPIO.OUT)
    self.GPIO.setup(self.pin_rs, GPIO.OUT)
 
    for pin in self.pins_db:
      self.GPIO.setup(pin, GPIO.OUT)
 
それぞれのピンが、出力ですよと定義してますね。
 
続いて
 
    self.write4bits(0x33) # initialization
    self.write4bits(0x32) # initialization
    self.write4bits(0x28) # 2 line 5x7 matrix
    self.write4bits(0x0C) # turn cursor off 0x0E to enable cursor
    self.write4bits(0x06) # shift cursor right
 
で、4bitのpins_dbからLCDに初期化処理を行ってます。
 
    self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF
 
これは、カーソルを制御するときに使う変数をセットしているようですね。
 
    self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS
    self.displayfunction |= self.LCD_2LINE
 
これ、この後に出てこないので、何のために定義しているのか不明(^^;
 
    """ Initialize to default text direction (for romance languages) """
    self.displaymode =  self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT
    self.write4bits(self.LCD_ENTRYMODESET | self.displaymode) #  set the entry mode
 
で、再度、LCDへのモードセットです。
 
これでやっとイニシャライズが終わり。
 
まだまだソース解析は続きます。
 
これって、結局のところ、Pythonの入門書を買って読んだ方が良いように思えますね。
さて、LCDにキャラクター表示してみよう!
 
先ずは、LCDパネルの準備。
 
16文字×2段のキャラクタ表示LCDを準備する。たまたま倉庫に転がっていたので、それを拝借して。。。
 
 
ケーブルの先には、コンタクトを使って纏めました。
 
 
で、これをラズパイのボードに取り付け。
 
LCDパネルの左側から1Pinとして
 
LCDの1Pin グランド J8Pinの6pin
LCDの2Pin 3.3V J8Pinの1pin
LCDの3Pin Vo J8Pinの39pin(これはLCDの輝度調整なので、とりあえずグランドに接続)
LCDの4pin RS J8Pinの22pin(GPIO25)
LCDの5pin RW J8Pinの20pin(グランド)
LCDの6pin EN J8Pinの18pin(GPIO24)
LCDの11pin D4 J8Pinの16pin(GPIO23)
LCDの12pin D5 J8Pinの11pin(GPIO17)
LCDの13pin D6 J8Pinの13pin(GPIO27)
LCDの14pin D7 J8Pinの15pin(GPIO22)
LCDの15pin LED+ J8Pinの17pin(3.3V)
LCDの16pin LED- J8Pinの9pin(グランド)
 
で接続します。
 
先ずは、gitというアプリケーションをインストールします。
 
「sudo apt-get install git」を実行
 
 
次に、ソースファイルをダウンロードするので
 
「git clone https://github.com/MissPhilbin/Adventure_9.git」を実行。
 
 
で、ディレクトリをrootからAdventure_9に移動してから、
 
「sudo python3 Adafruit_CharLCD.py」を実行。
 
で表示されるはずだが・・・
 
 あら!簡単に表示できたわ!!!
 
どうやって表示してるのかと、ソースをのぞいてみる。
 
 
なにやら、ソースの最終行にメッセージ文字がでているな。。。これを変えてみて
 
 
で、再度実行をかけると
 
 
お~~~!簡単じゃん!!
 
さて、どうやって制御しているのか???
 
ソース解析をしてみます。
 
 
 
 
さて、前回に引き続きIO制御にトライ。
 
前回は出力でしたが、今回は入力を組み込んでみました。
 
先ずは、前回のソースを以下のように変更。
 
 
先ずは、GPIO21の入力設定の追加をします。
 
その後、GPIO21がTrueならばGPIO24をON。GPIOがFalseならばGPIO24をOFFにします。
 
C言語と違って、If文とかWhile文のカッコが不要ですね。
 
コードが多くなると、見にくくならないか心配ですが。。。
 
GPIO21を選んだのは、単純にコネクタの端っこだからです。
 
こんな感じで、赤いクリップでつまみましたが、端っこじゃないと、隣のピンに触れそうで(^^;
クリップの反対側には10KΩの抵抗をつまんでおいて、
 
先ずは、隣のグランドピンを触ります。
 
グランドピンを触ると、GPIO21はFalseになるので、出力はOFFのままです。
 
 
変化が無いので、面白くないな・・・
 
さて、次に3.3Vのピンを触ります。
 
 
ちなみに、ラズパイのCPUのIOは3.3V駆動なので、5Vのピンを触ってはいけませんよ!!
 
すると、
 
 
お~ GPIO24がONになりました!!
 
こんな感じで、入出力制御は簡単にできました。
 
さて、次はキャラクタ表示のLCD制御に挑戦します。
 
 

さて、IOの制御をやってみます。

 

初めてラズパイでプログラムを組むな。

 

先ずは、GPIOを使うためのPython GPIOライブラリーをインストール。

 

「sudo apt-get install python-RPi.GPIO」

 

で実行。これで準備は完了です。

 

さて、いよいよプログラミング。

 

Python IDLE3をいうソフトを立ち上げます。

 

 

プログラムが立ち上がったところで、エディタを起動。

 

 

で、簡単にコーディング。

 

 

GPIOとtimeのライブラリーをインポートして、GPIO24を出力に設定。

後は、出力をTrue/FalseでON/OFFをしてあげるわけだ。

切替の間には、sleepを入れて、ON/OFFの間隔を調整している。

 

コーディングが終わったら、Documentsフォルダーに保存する。ファイル名は「LEDblink.py」にする。

 

 

LEDを付けると実験ぽいかもしれないけど、めんどうなのでオシロスコープで動作確認。

 

J8の18pin(GPIO24)と39pin(GND)につなぐ。

 

さて、プログラムスタート。

 

「sudo python3 LEDblink.py」を実行すればOK。オシロの波形を見ると、

 

 

お~ ちゃんとON/OFFしてるじゃん!!

 

1秒もけっこしっかりと誤差なく出てるね。

 

この時間は、どれくらい精度があるんだろう?

 

点滅間隔を0.01秒にしてみた。

 

 

ばっちりだ!これもほとんど誤差が出ない!

 

じゃあ0.001秒ならどうだ?

 

 

あれ?0.001秒+αがあるな・・・しばらく見ていると、、、

 

 

あれま・・・さすがに無理だったか(^^;

 

まあ、Linuxベースだろうから、リアルタイム性を求めるのは無理だよね。

 

と言うわけで、次回は入力を確認してみよう。

 

 

 

 

さて、日本語フォントと日本語入力ソフトをインストールしても”JP”が出てこない件。

 

 

これです。これが出てこない!!

 

いろいろインターネットを調べても出てこないぞ、、さて、困った。。。

 

と、適当にいろいろとクリックしていると!!

 

 

ん?iBusの設定があるぞ??!!これなんだ??と立ち上げてみると

 

上のように、「システムトレーにアイコンを表示する」にチェックをいれてと、、、

 

 

これこれ!これですよ!!

 

では、早速入力のテストを

 

 

ばっちり行けるじゃないですか!!(^^)

 

これでやっとスタートラインですね。

 

 

 

 

さて、日本語環境インストール完了!

 

では、早速タイプしてみるか!キーボードは、Starter Kitに添付のものだから、問題ないだろう!

 

で、9・0をShiftキーで”()”を出してみよう!

おや???なんだこりゃ???キーボードのタイプ設定がおかしいのかな???

 

あ、でもキーボードはUSBタイプのやつがいっぱい転がってるな。

 

繋ぎ変えてみたら、問題なく”()”が表示されました!

 

Starter Kitのキーボードは使えないみたいね。。。

 

さて、次は漢字の入力をと、、、、

 

あれ?マニュアルには、上の方に”JP"の表示が出ると書いてあったけど、、、、

 

まだ初期設定は終わらないようである。。。。

 

 

 

 

無事、SDカードに最新版のファイルを書き込めたので、再度立上げ。

 

電源を入れたら当然ながら普通に立ち上がる。

 

で、日本語環境対応のOSをインストール。これも同じ。

 

 

始まった。が・・・遅い! 待ってられないので、別の仕事してよ。

 

しばらくして戻ってくると、まだ終わっていない。。。また、席に戻って別の仕事。

 

 

お~やっと終わったw

 

これで、普通にラズビアンOSのデスクトップが普通に立ち上がった。ここまでは前回と同じ。

 

いよいよ、日本語フォントのインストール。

 

ターミナルを立ち上げて、「sudo apt-get update」を実行。

 

前回と同様、どこぞのURLにアクセスできないというエラーが・・・

 

おいおい、変わらないじゃないの(T-T)

 

続けて「sudo apt-get install ibus-mozc fonts-takao」を実行。

 

前回と同様、これはエラー無く終了。

 

あ~ これじゃあ前と変わらないな。。。 こりゃ文字化けするな(T-T)

 

と思いきや

 

 

お~~~~っ!!!!!文字化けしてないじゃん!!

 

やっとスタートラインに立てたよ!(^^)

 

て、いったい何が悪かったんだろう???わかる人いたら、コメントで教えて下さい。

 

さて、次はプログラムを作ってみよう。

さて、昨日に引き続き、SDカードにファイルが入らないので、パーティションの切り直し。

 

と言っても、そんな事やった事ないし・・・

 

インターネットで調べると、コマンドプロンプトから「DISKPART」という実行ファイルで切り直しができるらしい。早速挑戦。

 

その前に、SDカード内に、必要なファイルがあるので、バックアップととってと。

 

先ず、コマンドプロンプトを立ち上げて、rootに移動。

 

で、「diskpart」を実行する。

 

次に、現状のDISKを確認するために「list disk」を実行。すると、HDDから、外付けのメモリー(USBとかSDカードとか)まで、PCに接続されているディスクのサイズが出てくるので、変更したいディスク番号をチェックする。

 

次に、これから作業をするディスクを決定するために、「select disk 1」(変更したいディスク番号が1の場合)を実行すると、「ディスク1が選択されました」と表示される。

 

(注)ここで、間違ったディスクを選ぶと、PCのOSやらが消えてしまうなど地獄を見るので、十分に注意しましょう!

 

念のために、再度「list disk」を実行すると、選択したディスク番号の前に「*」が付いている。

 

さて、これで準備完了。

 

いよいよ現在のパーティションを消去します。

 

コマンドは「clean」。昔は、「clear」だったらしく、インターネットで検索すると、大抵これが出てくるので注意しましょう。と言っても、エラーで何も処理しないだけですが。

 

次に、消去されたディスクに新しいパーティションを定義します。

 

「create partition primary size=2048」

 

size= は、SDカードの容量内で、自分が必要なサイズを設定します。私の場合、ほんの0.1GB足りなかっただけでしたが、キリが悪いので、2GBでパーティションを切りました。

 

これで完成!

 

早速、ラズパイのNOOBSファイルをコピー。無事に完了です!!

 

いよいよラズパイ日本語化にトライです。