Quantcast
Channel: JH7UBCブログ
Viewing all 440 articles
Browse latest View live

ラズベリーパイ起動

$
0
0
 昨日、ラズベリーパイを起動させました。

 まず、キットに入ってきた、放熱器(ヒートシンク)大小をそれぞれ取り付けました。放熱器には両面テープが付けられていて、簡単に接着することができました。

イメージ 1

 次に、周辺機器を接続しました。

 今回は、すべて手持ちのデバイスです。

 ディスプレイは、SOTECの17インチ」ディスプレイLS17TR-04(息子からのもらいものです。)
 VGA入力なので、HDMI-VGA変換ケーブを介して接続しました。変換ケーブルは、Amazonで830円の物を購入しました。

 キーボードは、ELECOMのTK-FCM007BK(これも息子からのもらいもの。ちょっと大きいかな・・)

 マウスはELECOMのM-PG2UP2RBK

 接続が終わり、電源を入れると3つのラズベリーが表示され、しばらくすると(約1分)とディスクトップが表示されました。今回のキットでは、OSがプリインストールされていましたので、簡単にラズパイを起動することができました。

イメージ 2

 実は、このディスプレイの前に、2002年に購入した15インチ液晶ディスプレイの接続を試したのですが、ディスクトップの下の方が表示されず、解像度もよくなく、利用をあきらめました。あまり古いデバイスは、だめみたいです。

ラズパイの操作は、GUIでできます。操作感覚は、Windowsに似ています。左上のラズパイのロゴをクリックするとメニューが現れます。

イメージ 3

各メニュー項目には更にサブメニューがあり、例えばアクセサリーをクリックすると

イメージ 4

設定をクリックすると

イメージ 5

と表示されます。

Raspberry Piの設定で、言語、ライムゾーンなどの基本設定ができます。

電源を切るには、Shutdownをクリックすると

イメージ 6
オプションが表示され、Shutdownをクリックすると終了します。

今回の電源には、電源スイッチがついていますので、終了したら電源を切ります。

Raspberry Pi3には、WiFiが内蔵されています。

我が家の無線LANとの接続を試みましたが、パスワードが短すぎるといういメッセージが出て、うまく接続できませんでした。同じパスワードでパソコンでは、接続できるのに、なぜ?

しかたがないので、イーサケーブルで直接接続してみるとインターネットも簡単にできました。

Web上では、インターネット接続はあまり速くないという情報でしたが、実際に接続してみるとまずまず大丈夫です。
ただ、日本語入力ができないので、ちょっと不便です。

もともと、普通のパソコンとして使おうとは思っていませんでしたが、けっこういろいろな機能とアプリが入っているので驚きました。


ラズベリーパイ 日本語入力

$
0
0
 この金土日と、ちょっと忙しい日を過ごしました。

 今日の夜になって、ちょっと時間がありましたので、ラズベリーパイで、日本語入力が使えるようにしました。

 ラズベリーパイは、Linuxで動くコンピュータです。ですから、Linux用の日本語入力IMEをインストールする必要があります。

 さて、どうすればいいのか?

 Webを調べ、「できるかな?できるかな?」というサイトの情報参考にさせていただきました。

 方法は、Terminalモードで

sudo apt-get update
sudo apt-get install uimuim-mozc

を入力すると、おびただしいレポートの文字が表示され、やがてプロンプトに戻りました。

一旦ログアウトして、再度ログインしたら、日本語が使えるようになりました。

これで、日本語入力が使えるようになりました。

今回インストールした Mozcは、Google日本語入力のオープンソース版です。

このほかに無料で提供されている日本語IMEには、Linuxでは定番のAnthyがあります。

それにして、簡単なコマンドで、インストールができるんですね。

Windowsとは、違うなー。

ラズベリーパイ プリンターの接続

$
0
0
 今日は、ラズベリーパイにプリンタを接続し、使えるようにする作業をしました。

 参考にしたのは、「Poor and Junk」というサイトの「Raspberry Pi jessieでプリンターを利用する」という記事です。

 Linux(Unix)の印刷システムCUPS(Common Unix Printing System)をインストールする必要があります。

 このサイトを参照する前、CUPSだけをインストールして、再起動し、ブラウザから
 http://localhost:631/
でプリンタを探したのですが、「Forbidden」というプリンタ追加エラーが出て、NGでした。

 そこで、上記サイトの記事にあるとおり、

 sudo apt install cups system-config-printer

をTerminalモードで入力し、cupsをインストールしました。

 再起動すると、メニューの設定に印刷設定が追加されました。

イメージ 1

 私のプリンターは、EPSON EP-801Aです。

イメージ 2

 ラズベリーパイのUSBに接続して、電源を入れて、印刷設定画面を開くと、USB接続のEP-801Aが検出されます。
 後は、画面に従って、設定を進めるとプリンタが使えるようになりました。途中管理者権限が必要になる場面があり、IDとパスワードを要求されますが、ID:pi  パスワード:raspberryを入力します。

 テストプリントです。

イメージ 3

 LibreOffice Writerで文章を作成して、プリントしてみました。無事印刷できました。

 CUPSを使えば、ラズベリーパイに接続したプリンタをネットワークプリンタとして使用することができます。

 ラズパイ1個で、1台のプリンタを複数のパソコンで共有するネットワークプリンタにできます。たった5000円の投資で、普通のプリンタをネットワークプリンタにできるわけです。

 私は、その必要がありませんので、ラズパイでプリンタが使えれば十分です。

 毎日、少しずつ、一歩ずつラズパイとLinuxの世界が開けていきます。

 手のひらに乗るこの小さなコンピュータが少しずつ成長しているような気がします。

ラズベリーパイ 参考書

$
0
0
 我が家にラズベリーパイがやってきて、1週間になります。

 あれやこれやと毎日楽しんでいますが、昨日ターミナルモードでstartxというコマンドを入れて、初期画面を出して何かしようとしたときに、どこかキーボードを触ったのか、パスワードを要求されました。

 パスワードは、変更していませんので、[rapberry]のはず。

 そう入力しても、パスワードが間違っています、と返ってきてログインできません。

 パスワードをあれこれ入れても、ダメ。参りました。ラズパイ、ログインできなければ何もできない。

 仕方がないので、SDカードにダウンロードしておいた、OSのイメージファイルをコピーして、再セットアップしました。
 イメージファイルのコピーには、DD for Windows(シリコンリナックス社)を使いました。コピーに要する時間は、約10分でした。

 Windowsに比べれば、再セットアップの時間は短いです。それにしても、コマンドでの操作は、慎重にやらないといけませんね。

 さて、本日、メーリングリスト(福島マイコン愛好会 FMCA)仲間から推薦があったラズパイの参考書を購入しました。

イメージ 1

 金丸隆志著の「Raspberry Pi で学ぶ電子工作」です。

 Raspberry Pi3にも対応していて、ラズパイのOSのセットアップから書いてあります。

 電子工作についても、まったく初めての人にも分かりやすく解説してあります。

 電子工作で使う言語は、Pythonです。Pythonの勉強もこの本で進めたいと思います。

 相変わらず、WiFiは、開通していませんが、次はLチカ(LEDの点滅)に進みましょう。

ラズベリーパイ まずはLチカ

$
0
0
 ラズベリーパイを使ったプログラミングとして、まずは、定番のLチカをやってみました。

 ラズベリーパイでは、いくつかのプログラミング言語が使えますが、Raspberry PiのPiは、Python(パイソ)のことですから、Pythonでのプログラミングでやってみましょう。

 具体的な方法は、購入した参考書「Raspberry Piで学ぶ電子工作」に掲載されている通りです。

 ラズベリーパイのGPIOは、Arduinoとは、異なりピンタイプ(オス)になっています。(Arduinoはソケットタイプ(メス))

 今まで使っていたジャンパーケーブルは、オス―オスタイプで、使えませんので、メスーオスタイプのジャンパーケーブルを自作しました。

 被覆単線とピンソケットを用意して、
イメージ 1

 ピンソケットを一つずつに切り離して、はんだ付けしました。

イメージ 2

根元の部分には、絶縁テープを巻きました。

 本に書いてあった通りにプログラミングして、無事Lチカができました。

 が、エラーが出ないようにするための処理
 except KeyboardInterrupt:
       pass
で、except がinvalid syntaxになります。

 何故?

 この後、エラーの原因を発見。
 try:
をwhileループの前に入れるのを忘れたためでした。お粗末でした。


ラズベリーパイ ゲーム

$
0
0
 ラズベリーパイのRaspbianには、最初からゲームが入っています。

 メニューからゲーム→Python Gamesを選ぶとAudio 出力を選ぶダイアログが開きます。

イメージ 1

 ディスプレイは、HDMI-VGA変換でつないでいますので、HDMIは、使えませんので、Headphonesを選びました。

 けっこうたくさんのゲームが入っています。

イメージ 2

 pentomino 5block Tetrisを選びました。

イメージ 3

 懐かしい、あのテトリスです。ヘッドフォーンからは、ロシア民謡が流れ、30年以上前のパソコンの時代に戻れます。

 なお、アーディオ出力の切り替えは、コマンドラインから次のような操作でもできます。

sudo raspi-config

とコマンドを入れて、Raspberry Pi Software Configuration Toolを起動し、

7 Advaned Optionsを選び、

A9のAudioを選び

 0 Auto
 1 Force 3.5mm('head phone')jack
 2 Force HDMI
から目的のオーディオを選びます。

ラズベリーパイ Lチカアダプタ

$
0
0
 ラズベリーパイの勉強を少しずつ進めています。

 今、Pythonでのプログラムの第1作として、ビーコン送出器のプログラミングをしていますが、プログラムの動作確認をLEDでやっています。

 ラズベリーパイとブレッドボードをその度に行うのは面倒なので、LEDと抵抗を直列につないだLEDアダプタを作りました。抵抗は、330Ωです。

イメージ 1

 銅線たむき出しだとショートの恐れがありますので、ビニールテープで巻きました。

イメージ 2

 これをGPIOの20番ピン(GND)と22番ピン(GPIO25)に差し込みます。

イメージ 3

 Lチカで、点灯させてみると

イメージ 4

という具合です。

プログラムの動作チェックに使えそうです。

ラズベリーパイ CWビーコン送出プログラム

$
0
0
 ラズベリーパイでのPythonプログラミングの練習として、CWビーコン送出プログラムを作って見ました。

 アルゴリズムは、CQ誌2014年3〜5月後に掲載された7J3AOZ局の記事を参考にさせていただきました。
 簡単に説明しますと、モールス符号の短点を0、長点を1で表し、ストップビットを1とします。

 Aは、トツーつまり、・ーですので、最下位ビットから順に0。1そして次にストップビット1をセットして、110とします。
 同じようにして、Bは、ー・・・なので、1001となります。これをモールス符号の内部コードとします。
 内部コードを10進数で表すと。A,B,C,D,E,F・・・=6,17,21,9,2,20・・・

 内部コードを最下位ビットから順に送出します。内部コードを右にシフトして、ストップビットだけになったら(内部コードが1になったら)1文字送信終了です。

 ハード面では、基本的には、Lチカと同じで、GPIO25を出力に使い、GPIOがHIGHの時に送信になります。
 メッセージの文字に対応したモールス符号の内部コードをとりだし、最下位ビットから0なら短点、1なら長点を送出します。

 モールス信号の規則に従い、長点は、短点の3倍の長さ、短点と短点、短点と長点の間は、短点と同じ時間、文字と文字の間は、短点の3倍、文と文の間は、短点の7倍とします。

 テストプログラムですので、送信速度は固定で、短点を0.1秒としています。(約12WPM)

 Pythonでの自分で作った初めてのプログラムです。これで一応動きました。
--------------------------------------------------------------------------------
import  RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)
Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
message='VVV VVV DE JH7UBC JH7UBC PM97WR'
message_len=len(message)
def  dot():
        GPIO.output(25,GPIO.HIGH)
        sleep(0.1)
        GPIO.output(25,GPIO.LOW)
       
def dash():
        GPIO.output(25,GPIO.HIGH)
        sleep(0.3)
        GPIO.output(25,GPIO.LOW)
def space():
        sleep(0.6)
try:
        while True:
                for  i  in  range(message_len):
                        char_code = ord(message[i])
                        if char_code == 0x20:#space code
                                space()
                        else:
                                Mcode = Morse_Code[char_code - 48]
                                while  Mcode !=  1:
                                        mark =  Mcode & 1
                                        if  mark == 0:
                                                dot()
                                        else:
                                                dash()
                                        sleep(0.1)
                                        Mcode >>=1
                                sleep(0.3)
                sleep(0.7)
                        
except KeyboardInterrupt:
        pass
   
GPIO.cleanup()
-----------------------------------------------------------------------
ラズパイでの実際のプログラミングの様子です。予約語や関数などは、色が付き、分かりやすくなっています。

イメージ 1

左のウインドウが、Python2(IDLE)2.7.9 Shell

右のウインドウが、エディタです。

このGUIが使えるようになって、コマンドラインからの操作より、ずっと便利になりまし。(実は、2015年にPythonの勉強をしようとしましたが、中断してしまいました。)

送信機の代わりに、モールス練習機を接続して、動作を確認しました。

イメージ 2

ラズパイとのインターフェースは、ベースに1kΩを入れた2SC1815をオープンコレクタとして使いました。

フォトカプラを使っても良いと思います。

少し、Pythonでのプログラミングの仕方が分かってきました。

ラズパイ Python モールス符号練習機

$
0
0
 ラズパイ Pythonプログラミングの第2作です。

 第1作のCWビーコン送出機の応用で、ラズパイ・モールス符号練習機を作ってみました。

 モールス符号を送出するアルゴリズムは、前作のCWビーコン送出機と同じです。

 モールス符号をランダムに発生させるために、random関数を使います。

 まず、import randomで、ランダム関数モジュールをインポートします。

 ランダム関数には
randamo.random()  0.0~1.0までのfloat値を取得
random.uniform(x,y)  x~yまでのfloat値を取得
random.randint(x,y)  x~yまでのint値を取得
random.choice(param)  param名から1つの要素を取得
random.shuffle(array)  array内の要素をシャkフル
が、あります。

 今回は、random.randint(x,y)を使い、A~Z,0~9のASCIIコードをランダムに発生させます。

 モードは、アルファベットだけのモードと数字+アルファベットの2つにしました。
 また、速度は、10WPM(語/分)~30WPMまでの間で設定できるようにしました。

 Pythonでのプログラミングも少しずつ慣れてきましたが、BASICのようにGOTO命令がないので、プログラムの流れを変える方法に工夫が必要です。

 プログラムです。
---------------------------------------------------------
# -*- coding: utf-8 -*-
'''
Morse Trainer
2017.3.14 JH7UBC Keiji Hata
'''
import random
import  RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)
Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
counter = 0
y = 90
def dot():
        GPIO.output(25,GPIO.HIGH)
        sleep(dot_time)
        GPIO.output(25,GPIO.LOW)
       
def dash():
        GPIO.output(25,GPIO.HIGH)
        sleep(dash_time)
        GPIO.output(25,GPIO.LOW)
def space():
        sleep(space_time)
def morse_send():
        char_code = ord(moji)
        if char_code == 0x20:
                space()
        else:
                Mcode = Morse_Code[char_code - 48]
                while  Mcode !=  1:
                        mark =  Mcode & 1
                        if  mark == 0:
                                dot()
                        else:
                                dash()
                        sleep(dot_time)
                        Mcode >>=1
def mode_input():
        global mode
        print("1: ABC.....XYZ")
        print("2: 012..9AB..Z")
        mode = input('Select  1 or 2 ')
        if mode == 1 or mode == 2:
                return
        else:
                mode_input()
def speed_input():
        global speed
        speed = input("Speed(10-30 wpm)= ")
        if speed <10 or speed >30 :
                speed_input()
        else:
                return
def random_char():
        global mode
        global moji_ascii
        if mode ==1:
                x=65
        else:
                x=48
        moji_ascii =random.randint(x,y)
        if moji_ascii > 57 and moji_ascii < 65:
                random_char()
        else:
                return
       
       
try:
        while True:
                print('=== MORSE CODE TRAINER ===')
                print('STOP = ctrl + C')
                print('')
                mode_input()
                print('')
                speed_input()
                print('')
                dot_time = 1.2 / speed
                dash_time = dot_time * 3
                space_time = dot_time * 6
                while counter < 100:
                        random_char()
                        moji = chr(moji_ascii)
                        print moji,
                        morse_send()
                        sleep(space_time)
                        counter +=1
                        if counter % 10 == 0 :
                                print""
                counter = 0
                print('')
               
except KeyboardInterrupt:
        pass
   
GPIO.cleanup()
------------------------------------------------
操作は、Python Shell上で、対話型で行います。

アルファベットだけのモードの時の画面です。

文字を表示してからモールス符号を送出します。10文字で改行します。

イメージ 1

数字とアルファベットのモードです。

イメージ 2 

 モールス符号の信号は、ビーコン送出機と同じくGPIO25に出力します。

 GPIO25の信号から音を出すには、電子ブザー(秋月電子で販売しているHDB06LFPN)を使いました。

 GPIO25に直接電子ブザーを接続しても良いのですが、3.3Vでは、ちょっと音が小さいので、2SC1815でドライブしました。(今度はうるさいくらいです。Hi)なお、電子ブザーに流れる電流は約10mAです。

 回路図です。

イメージ 3

 ラズパイと電子ブザーを接続した様子です。

イメージ 4

 ラズベリーパイから直接音を出す方法があるようですので、勉強してやってみます。


 

ラズベリーパイ Python PWM

$
0
0
 ラズベリーパイのPWM(Pulse Width Modulation)の使い方の勉強と実験をしました。

 Raspberry Pi3 MODEL Bでは、精度の高いPWMは、2チャンネルです。

 どの程度の精度なのか、調べてみます。

 Pythonプログラムでは、PWMの制御は次のように行います。

 GPIO25から100Hzのパルスをデューティ比50%で出力するには

GPIO.setup(25,GPIO.OUT) #GPIO25を出力に設定

p=GPIO.PWM(25,100)#GPIO25,100Hz

p.start(50)#デューティ比50%の信号をスタート

PWM信号を止めるには

p.stop()

とします。

100Hzデューティ比50%の信号です。
イメージ 1

100Hz デューティ比20%の信号です。

イメージ 2

デューティ比は、0%~100%の間で設定できます。

PWMは、疑似アナログ出力として、モータの制御などに使われます。

周波数の精度は、どうでしょうか。

100Hzを周波数カウンタで測定してみました。

イメージ 3

 ±2Hz程度で、比較的良い制度です。

 1000Hzの設定での実測周波数です。

イメージ 4

875±3Hz程度です。

誤差12.5%というところでしょうか。

周波数は、あまり正確とはいえませんが、制御は、大丈夫でしょう。

PWMの出力に圧電スピーカを接続すれば、音が出ます。

モールス練習機の出力をPWMにすれば、圧電スピーカを使ってモールス練習機ができます。

プログラムの一部を次のように変更すればOKです。

p=GPIO.PWM(25,700)#GPIO25,700Hz   を加えます。

def dot()とdef dash()を次のように書き換えます。

def dot():
    p.start(50)
    sleep(dot_time)
    p.stop()

def dash():
    p.start(50)
    sleep(dash_time)
    p.stop()

 圧電スピーカを接続した様子です。

イメージ 5



ラズベリーパイ WebIOPi Lチカ

$
0
0
 ラズベリーパイの本来の力は、Linuxマシーンであることです。

 PICやArduinoが、基本的にシングルタスクであるのに対して、Linux OSのラズベリーパイは、ネットワーク上で動くマルチタスクマシーンなのです。

 ラズベリーパイを使って、今、話題のIoTを身近に体験してみます。

 そのためのアプリケーションWebIOPiを「Raspberry Piで学ぶ電子工作」を読みながら、ラズベリーパイにインストールしました。
 ターミナルモードでのダウンロード、イストールで本と画面を見比べながらの操作になりました。

 無事にWebIOPiを起動することができ、パソコン(Windows10)のブラウザ(Edge)から、ラズベリーパイのIPアドレスに直接アクセスしました。

 ラズパイからユーザー名とパスワードを要求され、本のとおりに入力するとWebIOPiのMain Mwnu画面が現れます。

イメージ 1
GPIO HeaderをクリックするとラズパイのGPIOの画面が表示されます。

イメージ 2

 デフォルトでは、GPIO25は、INに22なっていますので、クリックして、OUTにし、黒色の22をクリックすると赤に変わり、ラズパイのGPIO25に接続したLEDが点灯します。再び22をクリックすると黒色の変わり、LEDが消灯します。
イメージ 3

 これで、パソコンからインターネットを経由してラズパイを今十ロールできました。

 IoTの第一歩です。

ラズベリーパイ プリンターの接続

$
0
0
 今日は、ラズベリーパイにプリンタを接続し、使えるようにする作業をしました。

 参考にしたのは、「Poor and Junk」というサイトの「Raspberry Pi jessieでプリンターを利用する」という記事です。

 Linux(Unix)の印刷システムCUPS(Common Unix Printing System)をインストールする必要があります。

 このサイトを参照する前、CUPSだけをインストールして、再起動し、ブラウザから
 http://localhost:631/
でプリンタを探したのですが、「Forbidden」というプリンタ追加エラーが出て、NGでした。

 そこで、上記サイトの記事にあるとおり、

 sudo apt install cups system-config-printer

をTerminalモードで入力し、cupsをインストールしました。

 再起動すると、メニューの設定に印刷設定が追加されました。

イメージ 1

 私のプリンターは、EPSON EP-801Aです。

イメージ 2

 ラズベリーパイのUSBに接続して、電源を入れて、印刷設定画面を開くと、USB接続のEP-801Aが検出されます。
 後は、画面に従って、設定を進めるとプリンタが使えるようになりました。途中管理者権限が必要になる場面があり、IDとパスワードを要求されますが、ID:pi  パスワード:raspberryを入力します。

 テストプリントです。

イメージ 3

 LibreOffice Writerで文章を作成して、プリントしてみました。無事印刷できました。

 CUPSを使えば、ラズベリーパイに接続したプリンタをネットワークプリンタとして使用することができます。

 ラズパイ1個で、1台のプリンタを複数のパソコンで共有するネットワークプリンタにできます。たった5000円の投資で、普通のプリンタをネットワークプリンタにできるわけです。

 私は、その必要がありませんので、ラズパイでプリンタが使えれば十分です。

 毎日、少しずつ、一歩ずつラズパイとLinuxの世界が開けていきます。

 手のひらに乗るこの小さなコンピュータが少しずつ成長しているような気がします。

ラズベリーパイ 参考書

$
0
0
 我が家にラズベリーパイがやってきて、1週間になります。

 あれやこれやと毎日楽しんでいますが、昨日ターミナルモードでstartxというコマンドを入れて、初期画面を出して何かしようとしたときに、どこかキーボードを触ったのか、パスワードを要求されました。

 パスワードは、変更していませんので、[rapberry]のはず。

 そう入力しても、パスワードが間違っています、と返ってきてログインできません。

 パスワードをあれこれ入れても、ダメ。参りました。ラズパイ、ログインできなければ何もできない。

 仕方がないので、SDカードにダウンロードしておいた、OSのイメージファイルをコピーして、再セットアップしました。
 イメージファイルのコピーには、DD for Windows(シリコンリナックス社)を使いました。コピーに要する時間は、約10分でした。

 Windowsに比べれば、再セットアップの時間は短いです。それにしても、コマンドでの操作は、慎重にやらないといけませんね。

 さて、本日、メーリングリスト(福島マイコン愛好会 FMCA)仲間から推薦があったラズパイの参考書を購入しました。

イメージ 1

 金丸隆志著の「Raspberry Pi で学ぶ電子工作」です。

 Raspberry Pi3にも対応していて、ラズパイのOSのセットアップから書いてあります。

 電子工作についても、まったく初めての人にも分かりやすく解説してあります。

 電子工作で使う言語は、Pythonです。Pythonの勉強もこの本で進めたいと思います。

 相変わらず、WiFiは、開通していませんが、次はLチカ(LEDの点滅)に進みましょう。

ラズベリーパイ まずはLチカ

$
0
0
 ラズベリーパイを使ったプログラミングとして、まずは、定番のLチカをやってみました。

 ラズベリーパイでは、いくつかのプログラミング言語が使えますが、Raspberry PiのPiは、Python(パイソ)のことですから、Pythonでのプログラミングでやってみましょう。

 具体的な方法は、購入した参考書「Raspberry Piで学ぶ電子工作」に掲載されている通りです。

 ラズベリーパイのGPIOは、Arduinoとは、異なりピンタイプ(オス)になっています。(Arduinoはソケットタイプ(メス))

 今まで使っていたジャンパーケーブルは、オス―オスタイプで、使えませんので、メスーオスタイプのジャンパーケーブルを自作しました。

 被覆単線とピンソケットを用意して、
イメージ 1

 ピンソケットを一つずつに切り離して、はんだ付けしました。

イメージ 2

根元の部分には、絶縁テープを巻きました。

 本に書いてあった通りにプログラミングして、無事Lチカができました。

 が、エラーが出ないようにするための処理
 except KeyboardInterrupt:
       pass
で、except がinvalid syntaxになります。

 何故?

 この後、エラーの原因を発見。
 try:
をwhileループの前に入れるのを忘れたためでした。お粗末でした。


ラズベリーパイ ゲーム

$
0
0
 ラズベリーパイのRaspbianには、最初からゲームが入っています。

 メニューからゲーム→Python Gamesを選ぶとAudio 出力を選ぶダイアログが開きます。

イメージ 1

 ディスプレイは、HDMI-VGA変換でつないでいますので、HDMIは、使えませんので、Headphonesを選びました。

 けっこうたくさんのゲームが入っています。

イメージ 2

 pentomino 5block Tetrisを選びました。

イメージ 3

 懐かしい、あのテトリスです。ヘッドフォーンからは、ロシア民謡が流れ、30年以上前のパソコンの時代に戻れます。

 なお、アーディオ出力の切り替えは、コマンドラインから次のような操作でもできます。

sudo raspi-config

とコマンドを入れて、Raspberry Pi Software Configuration Toolを起動し、

7 Advaned Optionsを選び、

A9のAudioを選び

 0 Auto
 1 Force 3.5mm('head phone')jack
 2 Force HDMI
から目的のオーディオを選びます。

ラズベリーパイ Lチカアダプタ

$
0
0
 ラズベリーパイの勉強を少しずつ進めています。

 今、Pythonでのプログラムの第1作として、ビーコン送出器のプログラミングをしていますが、プログラムの動作確認をLEDでやっています。

 ラズベリーパイとブレッドボードをその度に行うのは面倒なので、LEDと抵抗を直列につないだLEDアダプタを作りました。抵抗は、330Ωです。

イメージ 1

 銅線たむき出しだとショートの恐れがありますので、ビニールテープで巻きました。

イメージ 2

 これをGPIOの20番ピン(GND)と22番ピン(GPIO25)に差し込みます。

イメージ 3

 Lチカで、点灯させてみると

イメージ 4

という具合です。

プログラムの動作チェックに使えそうです。

ラズベリーパイ CWビーコン送出プログラム

$
0
0
 ラズベリーパイでのPythonプログラミングの練習として、CWビーコン送出プログラムを作ってみました。

 アルゴリズムは、CQ誌2014年3〜5月後に掲載された7J3AOZ局の記事を参考にさせていただきました。
 簡単に説明しますと、モールス符号の短点を0、長点を1で表し、ストップビットを1とします。

 Aは、トツーつまり、・ーですので、最下位ビットから順に0、1そして次にストップビット1をセットして、110とします。
 同じようにして、Bは、ー・・・なので、1001となります。これをモールス符号の内部コードとします。
 内部コードを10進数で表すと、A,B,C,D,E,F・・・=6,17,21,9,2,20・・・

 内部コードを最下位ビットから順に送出します。0なら短点(dot)、1なら長点(dash)を送信します。内部コードを右に1ビットずつシフトして、ストップビットだけになったら(内部コードが1になったら)1文字送信終了です。

 ハード面では、基本的には、Lチカと同じで、GPIO25を出力に使い、GPIOがHIGHの時に送信になります。
 メッセージの文字に対応したモールス符号の内部コードをとりだし、最下位ビットから0なら短点、1なら長点を送出します。

 モールス信号の規則に従い、長点は、短点の3倍の長さ、短点と短点、短点と長点の間は、短点と同じ時間、文字と文字の間は、短点の3倍、文と文の間は、短点の7倍とします。

 テストプログラムですので、送信速度は固定で、短点を0.1秒としています。(約12WPM)

 Pythonでの自分で作った初めてのプログラムです。これで一応動きました。
--------------------------------------------------------------------------------
import  RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)
Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
message='VVV VVV DE JH7UBC JH7UBC PM97WR'
message_len=len(message)
def  dot():
        GPIO.output(25,GPIO.HIGH)
        sleep(0.1)
        GPIO.output(25,GPIO.LOW)
       
def dash():
        GPIO.output(25,GPIO.HIGH)
        sleep(0.3)
        GPIO.output(25,GPIO.LOW)
def space():
        sleep(0.6)
try:
        while True:
                for  i  in  range(message_len):
                        char_code = ord(message[i])
                        if char_code == 0x20:#space code
                                space()
                        else:
                                Mcode = Morse_Code[char_code - 48]
                                while  Mcode !=  1:
                                        mark =  Mcode & 1
                                        if  mark == 0:
                                                dot()
                                        else:
                                                dash()
                                        sleep(0.1)
                                        Mcode >>=1
                                sleep(0.3)
                sleep(0.7)
                        
except KeyboardInterrupt:
        pass
   
GPIO.cleanup()
-----------------------------------------------------------------------
ラズパイでの実際のプログラミングの様子です。予約語や関数などは、色が付き、分かりやすくなっています。

イメージ 1

左のウインドウが、Python2(IDLE)2.7.9 Shell

右のウインドウが、エディタです。

このGUIが使えるようになって、コマンドラインからの操作より、ずっと便利になりまし。(実は、2015年にPythonの勉強をしようとしましたが、中断してしまいました。)

送信機の代わりに、モールス練習機を接続して、動作を確認しました。

イメージ 2

ラズパイとのインターフェースは、ベースに1kΩを入れた2SC1815をオープンコレクタとして使いました。

フォトカプラを使っても良いと思います。

少し、Pythonでのプログラミングの仕方が分かってきました。

ラズパイ Python モールス符号練習機

$
0
0
 ラズパイ Pythonプログラミングの第2作です。

 第1作のCWビーコン送出機の応用で、ラズパイ・モールス符号練習機を作ってみました。

 モールス符号を送出するアルゴリズムは、前作のCWビーコン送出機と同じです。

 モールス符号をランダムに発生させるために、random関数を使います。

 まず、import randomで、ランダム関数モジュールをインポートします。

 ランダム関数には
randamo.random()  0.0~1.0までのfloat値を取得
random.uniform(x,y)  x~yまでのfloat値を取得
random.randint(x,y)  x~yまでのint値を取得
random.choice(param)  param名から1つの要素を取得
random.shuffle(array)  array内の要素をシャkフル
が、あります。

 今回は、random.randint(x,y)を使い、A~Z,0~9のASCIIコードをランダムに発生させます。

 モードは、アルファベットだけのモードと数字+アルファベットの2つにしました。
 また、速度は、10WPM(語/分)~30WPMまでの間で設定できるようにしました。

 Pythonでのプログラミングも少しずつ慣れてきましたが、BASICのようにGOTO命令がないので、プログラムの流れを変える方法に工夫が必要です。

 プログラムです。
---------------------------------------------------------
# -*- coding: utf-8 -*-
'''
Morse Trainer
2017.3.14 JH7UBC Keiji Hata
'''
import random
import  RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)
Morse_Code =[63,62,60,56,48,32,33,35,39,47,1,1,1,1,1,1,1,6,17,21,9,2,20,11,16,4,30,13,18,7,5,15,22,27,10,8,3,12,24,14,25,29,19]
counter = 0
y = 90
def dot():
        GPIO.output(25,GPIO.HIGH)
        sleep(dot_time)
        GPIO.output(25,GPIO.LOW)
       
def dash():
        GPIO.output(25,GPIO.HIGH)
        sleep(dash_time)
        GPIO.output(25,GPIO.LOW)
def space():
        sleep(space_time)
def morse_send():
        char_code = ord(moji)
        if char_code == 0x20:
                space()
        else:
                Mcode = Morse_Code[char_code - 48]
                while  Mcode !=  1:
                        mark =  Mcode & 1
                        if  mark == 0:
                                dot()
                        else:
                                dash()
                        sleep(dot_time)
                        Mcode >>=1
def mode_input():
        global mode
        print("1: ABC.....XYZ")
        print("2: 012..9AB..Z")
        mode = input('Select  1 or 2 ')
        if mode == 1 or mode == 2:
                return
        else:
                mode_input()
def speed_input():
        global speed
        speed = input("Speed(10-30 wpm)= ")
        if speed <10 or speed >30 :
                speed_input()
        else:
                return
def random_char():
        global mode
        global moji_ascii
        if mode ==1:
                x=65
        else:
                x=48
        moji_ascii =random.randint(x,y)
        if moji_ascii > 57 and moji_ascii < 65:
                random_char()
        else:
                return
       
       
try:
        while True:
                print('=== MORSE CODE TRAINER ===')
                print('STOP = ctrl + C')
                print('')
                mode_input()
                print('')
                speed_input()
                print('')
                dot_time = 1.2 / speed
                dash_time = dot_time * 3
                space_time = dot_time * 6
                while counter < 100:
                        random_char()
                        moji = chr(moji_ascii)
                        print moji,
                        morse_send()
                        sleep(space_time)
                        counter +=1
                        if counter % 10 == 0 :
                                print""
                counter = 0
                print('')
               
except KeyboardInterrupt:
        pass
   
GPIO.cleanup()
------------------------------------------------
操作は、Python Shell上で、対話型で行います。

アルファベットだけのモードの時の画面です。

文字を表示してからモールス符号を送出します。10文字で改行します。

イメージ 1

数字とアルファベットのモードです。

イメージ 2 

 モールス符号の信号は、ビーコン送出機と同じくGPIO25に出力します。

 GPIO25の信号から音を出すには、電子ブザー(秋月電子で販売しているHDB06LFPN)を使いました。

 GPIO25に直接電子ブザーを接続しても良いのですが、3.3Vでは、ちょっと音が小さいので、2SC1815でドライブしました。(今度はうるさいくらいです。Hi)なお、電子ブザーに流れる電流は約10mAです。

 回路図です。

イメージ 3

 ラズパイと電子ブザーを接続した様子です。

イメージ 4

 ラズベリーパイから直接音を出す方法があるようですので、勉強してやってみます。


 

ラズベリーパイ Python PWM

$
0
0
 ラズベリーパイのPWM(Pulse Width Modulation)の使い方の勉強と実験をしました。

 Raspberry Pi3 MODEL Bでは、精度の高いPWMは、2チャンネルです。

 どの程度の精度なのか、調べてみます。

 Pythonプログラムでは、PWMの制御は次のように行います。

 GPIO25から100Hzのパルスをデューティ比50%で出力するには

GPIO.setup(25,GPIO.OUT) #GPIO25を出力に設定

p=GPIO.PWM(25,100)#GPIO25,100Hz

p.start(50)#デューティ比50%の信号をスタート

PWM信号を止めるには

p.stop()

とします。

100Hzデューティ比50%の信号です。
イメージ 1

100Hz デューティ比20%の信号です。

イメージ 2

デューティ比は、0%~100%の間で設定できます。

PWMは、疑似アナログ出力として、モータの制御などに使われます。

周波数の精度は、どうでしょうか。

100Hzを周波数カウンタで測定してみました。

イメージ 3

 ±2Hz程度で、比較的良い制度です。

 1000Hzの設定での実測周波数です。

イメージ 4

875±3Hz程度です。

誤差12.5%というところでしょうか。

周波数は、あまり正確とはいえませんが、制御は、大丈夫でしょう。

PWMの出力に圧電スピーカを接続すれば、音が出ます。

モールス練習機の出力をPWMにすれば、圧電スピーカを使ってモールス練習機ができます。

プログラムの一部を次のように変更すればOKです。

p=GPIO.PWM(25,700)#GPIO25,700Hz   を加えます。

def dot()とdef dash()を次のように書き換えます。

def dot():
    p.start(50)
    sleep(dot_time)
    p.stop()

def dash():
    p.start(50)
    sleep(dash_time)
    p.stop()

 圧電スピーカを接続した様子です。

イメージ 5



ラズベリーパイ WebIOPi Lチカ

$
0
0
 ラズベリーパイの本来の力は、Linuxマシーンであることです。

 PICやArduinoが、基本的にシングルタスクであるのに対して、Linux OSのラズベリーパイは、ネットワーク上で動くマルチタスクマシーンなのです。

 ラズベリーパイを使って、今、話題のIoTを身近に体験してみます。

 そのためのアプリケーションWebIOPiを「Raspberry Piで学ぶ電子工作」を読みながら、ラズベリーパイにインストールしました。
 ターミナルモードでのダウンロード、イストールで本と画面を見比べながらの操作になりました。

 Web上では、ここにWebIOPiのインストールの仕方が、書いてあります。(本の方法とは若干違います)

 無事にWebIOPiを起動することができ、パソコン(Windows10)のブラウザ(Edge)から、ラズベリーパイのIPアドレスに直接アクセスしました。

 ラズパイからユーザー名とパスワードを要求され、本のとおりに入力するとWebIOPiのMain Mwnu画面が現れます。

イメージ 1
GPIO HeaderをクリックするとラズパイのGPIOの画面が表示されます。

イメージ 2

 デフォルトでは、GPIO25は、INに22なっていますので、クリックして、OUTにし、黒色の22をクリックすると赤に変わり、ラズパイのGPIO25に接続したLEDが点灯します。再び22をクリックすると黒色の変わり、LEDが消灯します。
イメージ 3

 これで、パソコンからインターネットを経由してラズパイを今十ロールできました。

 IoTの第一歩です。

Viewing all 440 articles
Browse latest View live