不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

paizaラーニング『PHP入門編7:関数を理解しよう (全6回) 』を受講してみた

2020-11-15 05:22:01 | paiza
だいぶ空いてしまったけど、続きをやっていこう。

PHP入門編7:関数を理解しよう (全6回)

01:関数について学習しよう

  • 関数とは
    • コードを分割して、共通で利用するための機能
    • 大規模プログラムの開発で必要
  • echoは関数ではない。

02:関数を作ろう

  • say_hello関数を作る
<?php
// 関数を作ろう

function say_hello() {
 echo "hello paiza";
}

say_hello();
?>

  • PHPでは関数定義の前でも使用できる。

03:引数と戻り値を追加しよう

  • say_hello関数を作る
<?php
// 関数を作ろう

function sum($x, $y) {
 echo $x + $y;
}

$num1 = sum(3, 2);
echo $num1."\n";

$num2 = sum(300, 400);
echo $num2."\n";

?>

04:スコープを理解しよう

  • スコープとは
    • スコープとは、変数の有効範囲が決まっていること
  • ローカルスコープ
    • {}に囲まれている関数内で定義されるスコープ
  • グローバルスコープ
    • ローカルスコープの外で定義した変数。プログラムの全体でどこでも使うことができる

05:RPGの攻撃シーンを作ろう

  • 今までの応用

06:引数のデフォルト値

  • 関数を作成する際に引数を定義するカッコの中の変数に値を代入することで、デフォルト値の設定ができる

CrowPiレッスン21:RaspberryPiカメラを使用して写真を撮る

2020-11-12 08:52:20 | CrowPi

Taking a picture using the Raspberry Pi camera

いよいよ最後のレッスンとなる、レッスン21"RaspberryPiカメラを使用して写真を撮る"をやっていく。

最後のレッスンはちょっと趣向が違ってアプリを使ったデモンストレーションとなっているようだ。
概要もあっさりしている。
CrowPiカメラはどのように使用できますか? 次の手順に従うと簡単になりますので、ご安心ください。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • CrowPi RaspberryPiカメラを使用して写真を撮る

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

camoramaのインストール

  1. 以下を実行してソフトウェアソースを更新する:
    sudo apt-get update
    sudo apt-get upgrade
    「apt-get upgrade」を実行すると、続行するかどうかを尋ねられるので、 yを入力する。
    (訳注:自分の環境だとディスク容量が足りないとのことでupgradeできなかった😅
  2. 実行時にソフトウェア「camorama」をインストールする:
    sudo apt-get install camorama
    (訳注:camoramaは廃止されたかなんだかで上記のコマンドではインストールできなかった😖
    そこでhttp://ftp.br.debian.org/debian/pool/main/c/camorama/camorama_0.19-5+b1_armhf.debでダウンロードして、インストールした。
    sudo apt-get install ./camorama_0.19-5+b1_armhf.deb
    あるいはCheeseというアプリをインストールしても良い。
    sudo apt-get install cheese
    ただその場合、/etc/modulesに以下を追記する必要がある。
    bcm2835-v4l2
    ↑最後から2番めの文字はLの小文字。数字の1ではない。以下参考。
    https://physical-computing-lab.net/raspberry-pi/rpi_camera.html
  3. ソフトウェアをインストールした後、ソフトウェアを開くには2つの方法がある。
    方法1:ソフトウェアを開いて実行時に写真を撮る:
    camorama
    方法2:デスクトップアイコンから:
    「Raspberrypiロゴ→グラフィックス→CamoramaWebcamViewer」をクリックします
    ソフトウェアを開くと、カメラが機能していることがわかります。 キーの組み合わせCTRL + Tを使用して写真を撮ったり、CTRL + Qで終了したりすることができます。 [編集]-> [設定]->Local Capture->Directory for captured pics->Browse...を選択して、写真を保存するパスを変更できます。 写真を保存する必要のあるパスを選択したら、[OK]をクリックして違いを確認し、最後に[閉じる]をクリックして設定を終了します。 もう一度写真を撮ると、新しく設定したパスに写真が保存されます。

CrowPi上のカメラの位置

一応今までのレッスンに即して、カメラの位置を示す。


camoramaを起動したところ


↑VNCでリモートアクセスしたCrowPiでcamoramaを起動したところ。
設定にもよるのかもしれないが、
camoramaの方が軽量だが低画質なのに対して、
cheeseは高画質だがその分重いって印象。

一応以上で"CrowPi-lessons.pdf"で解説されている21個のレッスンはすべて完了した。
ただ、YouTubeではレッスン動画の他にもいくつか動画がアップされているようなので、できる範囲でやってみたい。

CrowPiレッスン20:ブレッドボードを使用して独自のカスタム回路を作成する

2020-11-12 00:02:21 | CrowPi

Making your own custom circuit using the Bread Board

レッスン20"ブレッドボードを使用して独自のカスタム回路を作成する"をやっていく。
残り2レッスン、いよいよブレッドボードを使って回路を作成していくことになるのか。

とりあえず概要を引用
ブレッドボードは、CrowPiの一部として非常に便利です。これにより、独自のカスタム回路や機能を作成できます。
これらすべてのセンサーの使用方法を学んだ後、自分でセンサーを作成する方法を学ぶ時が来ました。
このレッスンでは、LEDの点滅の例を使用して、最初のカスタム回路を作成します。

LEDの点滅(通称、Lチカ)って結構この手のキットだと、最初にあったりするのだが、満を持してここで登場!
CrowPiだと回路を自分で設定しなくても色々なセンサーが試せたから、それってやっぱり改めてすごく便利なのだなって思う。😌 
自分は特にソフト屋だから、こういったハード系ってちょっと敷居高いんだよね。
だから、最初からセンサーが取り付けられた状態でプログラムが動くのって"できてる"って感覚が直ぐに体験できるのって大事。

色々CrowPiのこと褒めたけど、実はこのレッスンの説明は間違いだらけでかなりひどいものであった。
できる限り自分なりに修正したが、これを参考にする人も自己責任でやってほしい。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • ブレッドボードの上にカスタム回路を作成し、LEDを点滅させます。

何が必要か

  • 初期設定後のCrowPiボード
  • ジャンパー
  • 3mm / 5mm LED
  • 抵抗器
※ ってかジャンパーコードって付属していないぞっ!?仕方ないまた別のキットから拝借してくるか。😵 

Requires switching modules using the switch

  • はい、サーボピンを使用してカスタム回路を作成します。ピン番号7、9(※9ではなく、8。ただし、8はオンにする必要はない)は、スイッチを上にしてオンにします(センサーの切り替え方法を忘れた場合は、ページ番号5を参照してください)。

CrowPiのブレッドボードの場所

多分、2段落目が重要そうだから、とりあえず引用
ブレッドボードはCrowPiの真ん中にあり、カスタム回路を作成するために使用される多くの穴が内部にある小さなホワイトボードのように見えます。
一方、カスタム回路を作成するために、チュートリアルで前に示したサーボのインターフェイス、特にサーボ1インターフェイスも使用します。

↑右下のSERVO1も使う

「LEDの点滅」回路

回路の説明も重要だから、以下引用
文字通りLEDを点滅させるカスタム回路を作成します。
始める前に、正しいスイッチを正しく切り替えるようにしてください!
そのためには、前のレッスンで使用したように、出力としてGPIOを使用し、GNDを使用する必要があります。 GPIO 37ではサーボインターフェース(具体的にはSERVO1インターフェース)を使用します。
最初にカスタム回路を作成します。次の図を見てください。

この写真を参照して、ブレッドボード上に回路を作成できます。
PinNo37はSERVO1インターフェイスのGPIOポートにあることを忘れないでください。
GNDも同様にSERVO1インターフェイスのGNDポートにあります。
CrowPiパッケージに付属の抵抗を1つ取り、それをLEDのマイナス側プラス側に配線する必要があります(LEDのマイナス側は、2つのLEDレッグの間の短い方のレッグです)。
抵抗器の反対側から、ジャンパーを使用してSERVO1インターフェイスのGNDピンに直接配線します。(訳注:ここの説明が正しく図が間違い)
もう1つのLEDレッグはプラスのピンで、SERVO1のGPIO37ピンに直接配線して、制御して点滅させることができます。(訳注:ここも説明が正しく図が間違い)
最終結果は次のようになります。

↑多分、この最終結果の写真は正しく配線できていると推測されるが、いかんせん詳細が分からない。
そして、そもそもCrowPiに取り付けられているブレッドボード内の回路の仕組みについて何も説明がない。
おそらく、横方向にだけ回路がつながっているのだろう。
端っこの方は縦方向に回路がつながっているブレッドボードもあるが、これはそういうタイプではないと思われる。

ちなみに、抵抗器には極性がないらしいので、向きは気にしなくてよい。

電気が流れる回路なので極力間違いがないようにしてもらいたいが、上記のように惨憺たる内容なので、他のサイトも参考にして確認を取りつつ、なんとか、回路を作成した。
その結果、上記の最終結果の写真のように、回路を作り終えた途端にLEDが点灯したので、間違いではないらしい。

ほんとに回路ってちょっと間違っただけで簡単に部品が死ぬので、こういった間違いはあってはならないと思うのだが。😡 

点滅しているLEDの操作

解説も引用
点滅するLED回路を正常に作成したら、それを制御するコードを作成します。
このコードでは、LEDが接続されているサーボGPIO PINにGPIO.HIGHを送信し、0.2秒待ってから、GPIO.LOWでオフにします。
その無限の回数を繰り返して、LEDのオンとオフを切り替え、基本的に点滅させます。

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/blinking_led.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# http://elecrow.com/

import time
import RPi.GPIO as GPIO

# define LED pin
led_pin = 26

# set GPIO mode to GPIO.BOARD
GPIO.setmode(GPIO.BCM)
# set puin as input
GPIO.setup(led_pin, GPIO.OUT)

try:
 while True:
  # turn on LED
  GPIO.output(led_pin, GPIO.HIGH)
  # Wait half a second
  time.sleep(0.2)
  # turn off LED
  GPIO.output(led_pin, GPIO.LOW)
  # Wait half a second
  time.sleep(0.2)
except KeyboardInterrupt:
 # CTRL+C detected, cleaning and quitting the script
 GPIO.cleanup()

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
# define LED pin
led_pin = 37

# set GPIO mode to GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

このスクリプトを実行すると、点灯していたLEDが点滅をし始める。

↑消えて

↑点くの繰り返し

このスクリプトは無限ループとなるので、CTRL+Cで終了する。

また、レッスン動画の兄ちゃんの服が変わっとる😏 
なんだ?HILFIGERって?
そんなことはどうでもいいのだが、ちなみに、レッスン動画の解説部分でGPIOのピン番号を16としているが、37の間違い。
あと抵抗も使っていない。
いや奥の方に抵抗器が付いているようだ。
ただ、解説でトランジスタと呼んでいるように聞こえるが、抵抗だからレジスタじゃないのか?

回路の作成に関しては、楽しみにしていただけに、レッスンPDFの内容は実に残念なものであった。

CrowPiレッスン19:IRセンサーの制御と使用

2020-11-11 16:58:58 | CrowPi

Controlling and using the IR sensor

レッスン19"IRセンサーの制御と使用"をやっていく。

概要を引用
このレッスンでは、IRレシーバーの使用方法と、ミニIRリモコンから空気でIR(infra red;赤外線)コードを受信する方法を学習します。
この方法を使用すると、IRリモート上のボタンごとに異なるアクションを設定できるため、非常に便利です。 たとえば、ボタンを押すたびに異なるLEDをオンにしたり、サーボの動きを制御したりできます。 アラームをオフにするのはどうですか? このレッスンを学んだ後は、何でも可能です。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • IRレシーバーを制御し、IRリモートを介して信号を送信します

何が必要か

  • 初期設定後のCrowPiボード
  • IRリモコン(CrowPiキットに付属)


Requires switching modules using the switch

  • いいえ

CrowPi上のIRセンサーの位置

一応これも引用しとくか
DH11センサーの右側でCrowPiロゴのすぐ下にあるIRセンサー。 これは、リモコンがコードを受信するための受信機として使用する3ピンの小さなLEDと見なすことができます。
CrowPiキットに含まれているIRリモコンも必要です。必ず取り出して、レッスンの準備をしてください。

↓受光部を取り付けたところ

レッスンPDFには説明ないけど、レッスンビデオではこう付けてたから問題ないだろ🤔


IRレシーバーの操作

解説の引用
IRレシーバーの操作は、思ったほど難しくはありません。
LIRCやPython-LIRCと呼ばれるライブラリを使用するIRレシーバーは、リモコンを使用して送信するコードを受信し、それらに基づいて特定のアクションを実行します。
Out変数には、押したボタンが含まれています。特定のボタンをクリックしたかどうかを確認するパラメーターを作成し、その情報に基づいてコマンドを実行できます。

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/IR.py
import socket, signal
import lirc, time, sys
import RPi.GPIO as GPIO
from array import array

GPIO.setmode(11)
GPIO.setup(17, 0)
GPIO.setup(18, 0)
PORT = 42001
HOST = "localhost"
Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Lirc = lirc.init("keys")
#lirc.set_blocking(False, Lirc) # Un-Comment to stop nextcode() from waiting for a signal ( will return empty array when no key is pressed )

def handler(signal, frame):
 Socket.close()
 GPIO.cleanup()
 exit(0)

signal.signal(signal.SIGTSTP, handler)

def sendCmd(cmd):
 n = len(cmd)
 a = array('c')
 a.append(chr((n >> 24) & 0xFF))
 a.append(chr((n >> 16) & 0xFF))
 a.append(chr((n >> 8) & 0xFF))
 a.append(chr(n & 0xFF))
 Socket.send(a.tostring() + cmd)

while True:

 Out = lirc.nextcode()
 print(Out[0])

例のごとく、GPIO.setmodeとpin番号を修正。
って思ったら、なんか今までとコードの書き方が違う・・・
GPIO.setup()で直接pin番号を指定しているのはいいとして、
GPIO.setmode(11)の11って何だ?😯
GPIO.BOARDってことでいいのか?

まぁよくわからないが、このスクリプトを実行して、リモコンを押すと
って、あれっ!?反応しない
よくよくリモコンを見てみると電池が入っていないではないかっ!?
輸送の関係で入れられないのか?
それとも単にケチったのか?😒

仕方がないので以前別で買ったラズパイキットに同じようなリモコン付いてたからそちらから電池を拝借


するとちゃんと押したボタンがターミナルに表示されることを確認。

ちなみにもう一方のリモコンでも問題なく反応した。
ほぼ同じリモコンだが、ボタンの押した感じがちょっと異なる。


CrowPiレッスン18:ボタンマトリックスの使用と制御

2020-11-11 15:09:44 | CrowPi

Using and controlling the Button Matrix.

レッスン18"ボタンマトリックスの使用と制御。"をやっていく。

概要を引用
マトリックスボタンは、CrowPiボードの周りに16個の独立したボタンがあるモジュールで、シークレットコードキーパッド、メモリゲーム、または必要なものを制御するなど、幅広いプロジェクトに使用できます。
ボタンの可能性が広いので、どこからでも何でも作れます!

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • ボタンマトリックスがどのように機能し、GPIOピンを介してそれを制御する方法を理解する

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • はい、左側のスイッチ-すべてのピンを上にしてオンにします(センサーの切り替え方法を忘れた場合は、5ページを参照してください)

CrowPi上のボタンマトリックスの位置



ボタンマトリックスの操作

解説の引用
ボタンマトリックスは、それぞれ4つの列と行に組み込まれています。マトリックスの行と列をGPIOピンで構成し、ButtonMatrix()というオブジェクトをボタン変数に初期化します。
その後、ボタンの各ボタンに移動して、クリックされたかどうかを検出できるようになります。
この例では、ボタンが押された場合、activateButton()をアクティブにして、押されたボタン番号を出力します。 このモジュールを変更して、ボタンが押されたかどうかに関係なく、想像できるすべてのことを実行できるようにすることができます。

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/button_matrix.py
import RPi.GPIO as GPIO
import time

class ButtonMatrix():

 def __init__(self):

  GPIO.setmode(GPIO.BCM)

  # matrix button ids
  self.buttonIDs = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
  # gpio inputs for rows
  self.rowPins = [27,22,5,6]
  # gpio outputs for columns
  self.columnPins = [13,19,26,25]

  # define four inputs with pull up resistor
  for i in range(len(self.rowPins)):
   GPIO.setup(self.rowPins[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)

  # define four outputs and set to high
  for j in range(len(self.columnPins)):
   GPIO.setup(self.columnPins[j], GPIO.OUT)
   GPIO.output(self.columnPins[j], 1)
(以下、省略)

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
  GPIO.setmode(GPIO.BOARD)

  # matrix button ids
  self.buttonIDs = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
  # gpio inputs for rows
  self.rowPins = [13,15,29,31]
  # gpio outputs for columns
  self.columnPins = [33,35,37,22]

このスクリプトを実行して、マトリックスボタンを押すと、対応する数値がターミナル上に表示される。

↑ちなみに、上記のスクリプトの場合、ボタンの番号が、右上から左方向に1、2、・・・と割り振られていて、CrowPiボード上に書かれている番号と異なるので、ちょっと変な感じがする。
ボードに書かれた番号に対応させるには、スクリプトの該当部分を以下のように修正する。
  • self.columnPins = [13,19,26,25]