JH7UBCブログ

アマチュア無線、マイコンなど趣味のブログです。

Raspberry Pi

[ リスト | 詳細 ]

記事検索
検索

全5ページ

[1] [2] [3] [4] [5]

[ 次のページ ]

Python 2 から Python3へ

 Raspberry Pi3 MODELBに3.5インチLCDを取り付けたのをきっかけに、再びPython(パイソン)の勉強を始めました。
 今までは、Python2を使っていたのですが、最新のRspbianを導入してみるとPython3になっていました。

 この1年半のうちにラズパイもPythonも進化しているようです。Python3ライブラリも充実し、Python 3 の方が標準になってきたようです。こちらもPython3に移行することにしました。

 以前に作ったPython2用のスクリプトが、Python3では、そのままでは動かなくなりました。

 まず、頻繁に使用するprint文がPython3では、関数化され、いろいろなことができるようになっています。

 変わらない部分も多くありますが、2から3で変わった部分もあり、勉強をしながらプログラミングの練習で

 「数あてゲーム」を作ってみました。

 なお、Pythonの勉強には、次のサイトが役に立ちます。サイトの解説者に感謝します。


 
 数あてゲームのスクリプト(4桁の異なる数字の未知数をあてるゲームです)
 main program中で"""   """でコメントアウトしてある部分を解除すると未知数を表示させることができます。
プログラムのチェックに使えます。
-----------------------------------------------
"""
数あてゲーム
2019.3.17
JH7UBC Keiji Hata
"""
import random
r=[0,0,0,0]
a=""
#乱数を発生させる
def ransu():
    for i in range(4):
        r[i] = random.randint(0,9)

#全て違う数字4桁の乱数を発生させる
def michisu():
    flag=1
    while flag:
        flag=0
        ransu()
        for i in range(4):
            for j in range(i+1,4):
                if r[i] == r[j]:
                    flag = 1
    print('X = ????')

#4桁の数字を入力(全て違う数値)
def nyuryoku():
    global a
    flag = 1
    global count
    while flag:
        flag = 0
        print('{}回目' .format(count))
        a=input('X = ')
        for i in range(4):
            for j in range(i+1,4):
                if a[i] == a[j]:
                    flag =1
        if flag == 1:
            print('もう一度')

#合っている数字を数える
def num_check():
#数字が合っている数
    global xcount
    xcount = 0
    for i in range(4):
        for j in range(4):
            if a[i]==str(r[j]):
                xcount += 1

#位置が合っている数
    global ycount
    ycount = 0
    for i in range(4):
        if a[i] == str(r[i]):
            ycount += 1
                      
  
#main program
try:
    print('*** 数あてゲーム ***')
    print(' 強制終了は ctrl+C')
    print()
    gflag = 1
    while gflag:
        sflag = 1
        count = 1
        michisu()
        """
        for i in range(4):
            print(r[i],end='')
        print()
        print()
        """
        while sflag:
            nyuryoku()
            num_check()
            print('('+str(xcount)+','+str(ycount)+')')
            print()
            if (xcount==4)and(ycount==4):
                print('正解です!')
                sflag = 0
                replay = input('ゲームを続けますか(y/n)')
                if (replay == 'y') or (replay == 'Y') :
                    pass
                else:
                    gflag = 0
                    print('また遊んでね!')
            else:
                count += 1
except KeyboardInterrupt:
    pass

ラズパイ用3.5インチLCD

 1年半ぶりにRaspberry Pi3 ModelBを引っ張り出してきました。

 ネット上で評判が良いQuimatの3.5インチLCDディスプレイを購入しました。Amazonでケース付きで3,320円でした。

 品物が到着して、さっそくラズパイにせつぞくしてみました。ネット上の情報では、そのままラズパイのディスクトップ画面が表示されるとのこと。

 ところが

イメージ 1

 虹色の画面になって、立ち上がりません。

 しばらくラズパイを使ってやらなかったので、ラズパイがへそを曲げたのかもしれませんね。Hi

 ネットで調べると電源電圧が低いか、Kernel.imgのブートに失敗した場合にこの虹色画面になるようです。

 電源は、5V 2.5Aで、電圧を測定しても問題ありません。

 次にmicroSDカードを調べると読み込みはできますが、書き込み禁止状態になっていて、書き込みもフォーマットもできません。どうやらmicroSDカードの異常のようです。

 そこで、新品のmicroSDカードを購入して、Raspberry の再セットアップを行いました。

 2年前にこの作業を行っているのですが、Raspbianのバージョンも上がっていますので、こちらのサイトを参考にセットアップを行いました。たいへん参考になりました。ありがとうございました。

 RaspbianをmicroSDにコピーしてセットすると無事立ち上がりました。(ホッ)

 先ほどのサイトを参考に初期設定とupdateをしました。

 が・・・・、このアップデートがものすごーーーく時間がかかりました。なんと3時間くらいかかりました。

 ラズパイ・オリジナルのサーバーでは、このように時間がかかるので、皆さんミラーサーバーを使っているようです。
 update WiFi設定が終わり、QuimatのLCDを接続すると無事ディスクトップ画面が表示されました。

イメージ 2

 解像度の調整とタッチパネルの設定をして一応完了です。

 解像度は最初、800× 600に設定したのですが、「字が小さくて読めない!」ので

 640×400に設定ました。

 これで、重いディスプレイを持ってこなくともラズパイで遊べるようになりました。

 思い出すために少しこのまま遊んで、その後SDRソフトを動かして先日実験したSDRフロントエンドと組み合わせて、SDR受信機にする実験をしたいと思っています。

Raspberry Pi I2C LCD1602

 Raspberry Pi3 Model BでI2Cシリアルインターフェース付きのLCD1602の表示実験をしました。

 LCD1602は、アマゾンから購入したSODIAL LCD1602で、I2Cシリアルインターフェースモジュールは、同じくアマゾンから購入したEasy Word Mallのもので、LCD1602の裏側に取り付けました。

イメージ 1

 このモジュールには、PHILIPS社のPCF8574というI2Cバス・8ビットパラレルバスインターフェースICが使われています。つまり、I2Cシリアルバスのデータ受信し、ACK信号で8ビットパラレスバスに出力する、シリアル・パラレルインターフェースです。

 まず、このモジュールのI2Cスレーブ・アドレスを調べました。0x27です。

イメージ 2

 PCF8574モジュールとRaspberry Piの接続は、LCD側が5V、ラズパイ側が3.3Vなので、I2Cレベル変換モジュールを間に入れました。

 下の図の回路図ように接続しました。

イメージ 3

 表示テストのスクリプトは、前の記事LCD1602表示テストの記事Circuit Basicsというサイトなどを参考にして、自分なりに書いてみました。

 テストに使ったスクリプトです。
--------------------------------
"""
I2C LCD1602 test
use PCF8574 I2C pararel interface
2017.6.12
JH7UBC Keiji Hata
"""
# -*- coding:utf-8 -*-
from time import sleep
import smbus
#PCF8574 LCD1602 connection
#P0 = LCD RS
#P1 = LCD R/W
#P2 = LCD E
#P3 = LCD BackLight
#P4 = LCD DB4
#P5 = LCD DB5
#P6 = LCD DB6
#P7 = LCD DB7
bus = smbus.SMBus(1)
LCD_addr = 0x27
LCD_EN = 0b0000100#LCD Enable
LCD_BL = 0b0001000#LCD BackLight
LCD_CMD = 0x00#command mode
LCD_CHR = 0x01#character mode
LCD_CHARS = 16
LCD_LINE1 = 0x80#Line1 top address
LCD_LINE2 = 0xC0#Line2 top address

def LCD_write(bits,mode):
    #High 4bits
    data = (bits & 0xF0) | mode
    bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
    sleep(0.0001)#wait 100us
    #Low 4bits
    data = ((bits << 4) & 0xF0) | mode
    bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
    sleep(0.0001)#wait 100us

def LCD_init():
    LCD_write(0x33,LCD_CMD)
    LCD_write(0x32,LCD_CMD)
    LCD_write(0x06,LCD_CMD)
    LCD_write(0x0C,LCD_CMD)
    LCD_write(0x28,LCD_CMD)
    LCD_write(0x01,LCD_CMD)
    sleep(0.001)

def LCD_text(message,line):
    message = message.ljust(LCD_CHARS," ")
    LCD_write(line,LCD_CMD)
    for i in range(LCD_CHARS):
        LCD_write(ord(message[i]),LCD_CHR)

def main():
    while True:
        LCD_text("Hello World!",LCD_LINE1)
        LCD_text("JH7UBC",LCD_LINE2)
        sleep(3)
        LCD_text("ABCDEFGHIJKLMNOP",LCD_LINE1)
        LCD_text("1234567890123456",LCD_LINE2)
        sleep(3)
try:
    LCD_init()
    main()
   
except KeyboardInterrupt:
    pass
------------------------------------------
テストの様子です。
イメージ 4

 とりあえず、初期化と表示だけの実験です。

 なお、詳しい説明をJH7UBCホームページに掲載しました。


Rasperry Pi I2C

 I2CアダプタをつけたLCD102をRaspberry Piで表示する勉強をしています。

 Raspberry PiのPythonで、I2C通信をbyte単位で行う関数は、

 write_byte_data(アドレス,コマンド,1バイトの値) です。

 実際にどのような信号がラズパイから出ているのか観察してみました。 

 測定用に次のような簡単なスクリプトを書き、I2Cの出力をpico scopeで記録しました。

from time import sleep
import smbus
bus = smbus.SMBus(1)
LCD_address = 0x27
try:
    while True:
        bus.write_byte_data(LCD_address,0x00,0x12)
        sleep(0.0001)
except KeyboardInterrupt:
    pass

ラズパイのSCLとSDA信号です。
イメージ 1


SCLの周波数は、約62.5KHzで、パルス幅は、約8usです。

1byteを送るのに要する時間は、約140usです。

I2Cデバイスを接続しないとIOエラーが出ます。

これを参考にして、I2Cアダプタ付きのLCD1602の表示テストのスクリプトを書いてみます。 

Raspberry Pi Python LCD1602

 マイコンでは、定番のLCD表示器LCD1602をラズパイで表示する実験をしました。(言語はPython)

 Web上には、I2CのLCD1602の表示例は、見られますが、従来のLCD1602の表示例は、あまり見られません。

 海外のサイトには、いくつか例が見られ、MBTECHWORKSというサイトのスクリプトを試しました。

 使用したLCD1602は、aitendoの1602A-VA-Bです。

イメージ 1

 接続の回路図は

イメージ 2

 LCD1602には、VDDとVssが反対の物もありますので、要注意。

また、バックライトのA(アノード)への電源への接続も、直接接続するものと、上の図のように電流制限抵抗を入れるものとがありますので、これも要注意。

更に、LCDのR/Wは、必ずGNDに接続します。これは、5V用のLCD1602を使用する場合、LCDからの情報(BUSYチェックなど)を受け取る場合は、5Vの信号が来てしまうため、LCD1602をWriteモードだけで使用するためです。

次は、LCD1602にI2C用のアダプタを装着したものの表示テストをします。

全5ページ

[1] [2] [3] [4] [5]

[ 次のページ ]


.
JH7UBC
JH7UBC
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について
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 29 30

よしもとブログランキング

もっと見る

[PR]お得情報

ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事