SunFounder Robot HAT¶
SunFounder Robot HATをお選びいただき、ありがとうございます。
注釈
このドキュメントは以下の言語で利用可能です。
ご希望の言語でドキュメントにアクセスするために、それぞれのリンクをクリックしてください。

Robot HATは、Raspberry Piを迅速にロボットに変換できる多機能拡張ボードです。MCUが搭載されており、Raspberry PiのPWM出力とADC入力を拡張するとともに、モータードライバーチップ、Bluetoothモジュール、I2Sオーディオモジュール、モノラルスピーカー、そしてRaspberry Pi自体から出るGPIOも搭載しています。
また、背景音楽や効果音を再生し、TTS機能を実装してプロジェクトをより魅力的にするためのスピーカーも付属しています。
7-12V PH2.0 2ピン電源入力と2つの電源インジケータを受け入れます。このボードには、ユーザーが使用可能なLEDと、いくつかの効果を迅速にテストするためのボタンも備えています。
この文書では、SunFounderが提供するPython robot-hat
ライブラリを通じて、Robot HATのインターフェイス機能とこれらのインターフェイスの使用方法を完全に理解できます。
特徴¶
シャットダウン電流:<0.5mA
電源入力:USB Type-C、5V/2A
充電電力:5V/2A 10W
出力電力:5V/3A
付属のバッテリー:2 x 3.7V 18650リチウムイオンバッテリー、XH2.0 3Pインターフェース
バッテリー保護:逆極性保護
充電保護:入力低電圧保護、入力過電圧保護、充電バランス、過熱保護
オンボード充電指示灯:CHG
オンボード電源指示灯:PWR
オンボード2つのバッテリーレベル指示LED
オンボードユーザーLED、2つの触覚スイッチ
モータードライバー:5V/1.8A x 2
4チャンネル12ビットADC
12チャンネルPWM
4チャンネルデジタル信号
オンボードSPIインターフェース、UARTインターフェース、I2Cインターフェース
モノスピーカー:8Ω1W
パラメータ: |
最小値: |
典型値: |
最大値: |
単位: |
---|---|---|---|---|
入力電圧: |
4.25 |
5 |
8.4 |
V |
バッテリー入力電圧: |
6.0 |
7.4 |
8.4 |
V |
過充電保護(バッテリー): |
8.3 |
V |
||
入力低電圧保護: |
4.15 |
4.25 |
4.35 |
V |
入力過電圧保護: |
8.3 |
8.4 |
8.5 |
V |
充電電流(5V): |
2.0 |
A |
||
出力電流(5V): |
3.0 |
A |
||
出力電圧: |
5.166 |
5.246 |
5.327 |
V |
充電過熱保護: |
125 |
135 |
145 |
°C |
DC-DC過熱保護: |
70 |
75 |
80 |
°C |
モーター出力電流: |
1.8 |
A |
ハードウェア紹介¶
Robot Hat V4には、2つのリチウムバッテリー充電、5V/3A DC-DC放電、I2Sオーディオ出力およびスピーカー、シンプルなバッテリーレベルインジケータ、マイクロコントローラベースのPWMおよびADCドライバ、モータードライバが特徴です。
ピン配置¶

- Power Port
7-12V PH2.0 3ピン電源入力。
Raspberry PiとRobot HATを同時に給電します。
- Power Switch
Robot HATの電源をオン/オフします。
電源ポートに電源を接続すると、Raspberry Piが起動します。しかし、Robot HATを有効にするためには、電源スイッチをONに切り替える必要があります。
- Type-C USB Port
Type-Cケーブルを挿入してバッテリーを充電します。
同時に、充電インジケータが赤色で点灯します。
バッテリーが完全に充電されると、充電インジケータが消灯します。
バッテリーが完全に充電された後、約4時間USBケーブルがまだ接続されている場合、充電インジケータが点滅してプロンプト表示されます。
- Digital Pin
4チャンネルのデジタルピン、D0-D3。
ピン: Digital IO。
API: クラス Pin。
- ADC Pin
- PWM Pin
- Left/Right Motor Port
2チャンネルXH2.54モーターポート。
ピン: モーターポート。
API: モジュール motor、
1
は左モーターポート用、2
は右モーターポート用。
- I2C Pin and I2C Port
- SPI Pin
P2.54 7ピンSPIインターフェース。
ピン: SPI。
- UART Pin
P2.54 4ピンインターフェース。
ピン: UART。
- RST Button
- USR Button
- Battery Indicator
電圧が7.6Vを超えると2つのLEDが点灯します。
7.15Vから7.6Vの範囲では1つのLEDが点灯します。
7.15V以下では両方のLEDが消灯します。
- Speaker and Speaker Port
Speaker:これは2030オーディオチャンバースピーカーです。
Speaker Port:Robot HATは、2030オーディオチャンバースピーカーと共に、オンボードI2Sオーディオ出力を備え、モノサウンド出力を提供します。
ピン: スピーカーとスピーカーポート。
API: クラス Music
ピンマッピング¶
Robot Hat V4 |
Raspberry Pi |
Robot Hat V4 |
Raspberry Pi |
---|---|---|---|
NC |
3V3 |
5V |
5V |
SDA |
SDA |
5V |
5V |
SCL |
SCL |
GND |
GND |
D1 |
GPIO4 |
TXD |
TXD |
GND |
GND |
RXD |
RXD |
D0 |
GPIO17 |
I2S BCLK |
GPIO18 |
D2 |
GPIO27 |
GND |
GND |
D3 |
GPIO22 |
モーター1 DIR |
GPIO23 |
NC |
3V3 |
モーター2 DIR |
GPIO24 |
SPI MOSI |
MOSI |
GND |
GND |
SPI MISO |
MISO |
USRボタン |
GPIO25 |
SPI SCLK |
SCLK |
SPI CE0 |
CE0 |
GND |
GND |
NC |
CE1 |
NC |
ID_SD |
NC |
ID_SC |
MCUリセット |
GPIO5 |
GND |
GND |
(SPI)BSY |
GPIO6 |
ボード識別子 2 |
GPIO12 |
ボード識別子 1 |
GPIO13 |
GND |
GND |
I2S LRCLK |
GPIO19 |
RSTボタン |
GPIO16 |
ユーザー LED |
GPIO26 |
NC |
GPIO20 |
GND |
GND |
I2S SDATA |
GPIO21 |
Digital IO¶
Robot HATには4セットの3ピンデジタルピンがあります。

Robot Hat V4 |
Raspberry Pi |
---|---|
D0 |
GPIO17 |
D1 |
GPIO4 |
D2 |
GPIO27 |
D3 |
GPIO22 |
ADC¶

Robot HATは、4セットの3ピンADC(アナログ・デジタルコンバータ)ピンを特長としており、それぞれが2.54mm間隔で配置されています。これらのピンは3.3Vの電源で動作します。12ビットの精度を提供するADC機能は、オンボードのマイクロコントローラによって容易になっています。ADC値の読み取り方法の詳細は、 オンボードMCU セクションで提供されています。

また、ADCチャネルA4は抵抗を使用した電圧分割器を介してバッテリーに接続されており、バッテリー電圧を測定しておおよそのバッテリー残量を推定するために使用されます。
電圧分割比は20K/10Kなので:
A4電圧 (Va4) = value_A4 / 4095.0 * 3.3
バッテリー電圧 (Vbat) = Va4*3
バッテリー電圧 (Vbat) = value_A4 / 4095.0 * 3.3 * 3
PWM¶

Robot HATには、2.54mm間隔で配置された4セットの3ピンPWMピンがあり、電源は5Vです。PWMの使用方法は、 オンボードMCU で詳しく説明されています。
注釈
PWM13および14チャンネルはモータードライブ用に使用されます。
I2C¶

Robot HATには2つのI2Cインターフェイスがあります。一つはP2.54 4ピンインターフェイス、もう一つはQWIICおよびSTEMMA QTと互換性のあるSH1.0 4ピンインターフェイスです。これらのI2CインターフェイスはGPIO2 (SDA)およびGPIO3 (SCL)を介してRaspberry PiのI2Cインターフェイスに接続されています。ボードには オンボードMCU も搭載されており、2つの信号線には10Kのプルアップ抵抗があります。
SPI¶

Robot HATのSPIインターフェイスは7ピンのP2.54インターフェイスです。これはRaspberry PiのSPIインターフェイスに接続され、割り込みやリセットなどの目的に使用できる追加のI/Oピンを含んでいます。
Robot Hat V4 |
Raspberry Pi |
---|---|
BSY |
GPIO6 |
CS |
CE0(GPIO8) |
SCK |
SCLK(GPIO11) |
MI |
MISO(GPIO9) |
MO |
MOSI(GPIO10) |
3V3 |
3.3V 電源 |
GND |
グラウンド |
UART¶

Robot HATのUARTインターフェイスは4ピンのP2.54インターフェイスです。これはRaspberry PiのGPIO14 (TXD)とGPIO15 (RXD)ピンに接続されます。
スピーカーとスピーカーポート¶
Robot HATにはオンボードのI2Sオーディオ出力が搭載されており、2030オーディオチャンバースピーカーと共にモノラルサウンド出力を提供します。
I2S |
Raspberry Pi |
---|---|
LRCLK |
GPIO19 |
BCLK |
GPIO18 |
SDATA |
GPIO21 |
モーターポート¶
Robot HATのモータードライバーは2チャンネルをサポートしており、2つのデジタル信号を使用して方向を制御し、2つのPWM信号を使用して速度を制御することができます。
モーター |
IO |
---|---|
モーター1方向 |
GPIO23 |
モーター1電源 |
PWM13 |
モーター2方向 |
GPIO24 |
モーター2電源 |
PWM12 |
バッテリーレベルインジケーター¶
Robot HATのバッテリーレベルインジケーターは、電圧分割器法を使用してバッテリー電圧を監視し、バッテリーレベルの推定のための参考として機能します。LEDと電圧の関係は以下の通りです:
LEDバッテリー |
合計電圧 |
---|---|
2つのLED点灯 |
7.6V以上 |
1つのLED点灯 |
7.15V以上 |
両方のLED消灯 |
7.15V未満 |
バッテリーのうちの1つが4.1Vに達するかそれを超えると、他のバッテリーがその閾値以下の場合、その特定のバッテリーの充電電流が減少します。
バッテリーについて¶
バッテリー

VCC: バッテリーの正極端子。ここにはVCCとGNDの2組があり、電流を増やし抵抗を減らすためです。
Middle: 二つのセル間の電圧をバランスさせ、バッテリーを保護します。
GND: バッテリーの負極端子。
これはSunFounderによって製造されたカスタムバッテリーパックで、2000mAhの容量を持つ18650バッテリー2個で構成されています。コネクターはPH2.0-3Pで、シールドに挿入後、直接充電が可能です。
特徴
バッテリー充電: 5V/2A
バッテリー出力: 5V/5A
バッテリー容量: 3.7V 2000mAh x 2
バッテリー寿命: 90分
バッテリー充電時間: 130分
コネクター: PH2.0, 3P
robot-hat
モジュールのインストール¶
robot-hat
はRobot HATに対応したライブラリです。
警告
Raspberry Pi OSをインストールする際には、 Raspberry Pi OS (Legacy) バージョンの Debian Bullseye を使用してください。
インストールするバージョンが Bookworm の場合、 Speaker が正しく機能しないことがあります。

システムをアップデートしてください。
インターネットに接続していることを確認し、システムをアップデートしてください:
sudo apt update sudo apt upgrade
注釈
OSの Lite バージョンをインストールする場合、Python3関連のパッケージをインストールする必要があります。
sudo apt install git python3-pip python3-setuptools python3-smbus
このコマンドをターミナルに入力して、
robot-hat
パッケージをインストールします。cd ~/ git clone -b v2.0 https://github.com/sunfounder/robot-hat.git cd robot-hat sudo python3 setup.py install
注釈
setup.py
を実行して必要なコンポーネントをダウンロードします。ネットワークの問題でダウンロードが失敗することがあります。その場合は、再度ダウンロードが必要になるかもしれません。次のような場合には、Y
と入力しEnter
を押してプロセスを続行してください。
スピーカー用の i2samp.sh
をインストールする¶
i2samp.sh
は、Raspberry Piや類似のデバイスでI2S(Inter-IC Sound)アンプを設定し、構成するために特別に設計された高度なBashスクリプトです。MITライセンスのもとで、さまざまなハードウェアとオペレーティングシステムとの互換性を保証し、インストールや構成を進める前に徹底的なチェックを行います。
スピーカーを適切に動作させたい場合は、このスクリプトのインストールが絶対に必要です。
手順は以下の通りです:
cd ~/robot-hat
sudo bash i2samp.sh
y
と入力し enter
を押して、スクリプトの実行を続けます。
y
と入力し enter
を押して、バックグラウンドで /dev/zero
を実行します。
y
と入力し enter
を押して、Raspberry Piを再起動します。
警告
再起動後に音が出ない場合は、 i2samp.sh
スクリプトを数回実行する必要があるかもしれません。
オンボードMCU¶
Robot HATは、ArteryのAT32F415CBT7マイクロコントローラーを搭載しています。これは、最大クロック周波数が150MHzのARM Cortex-M4プロセッサーです。マイクロコントローラーには、256KBのフラッシュメモリと32KBのSRAMがあります。
オンボードのPWMとADCは、マイクロコントローラによって駆動されます。Raspberry Piとマイクロコントローラ間の通信は、I2Cインターフェイスを通じて確立されます。通信に使用されるI2Cアドレスは0x14(7ビットアドレス形式)です。
紹介¶
オンボードMCUのRESETピンは、Raspberry PiのGPIO 5、または robot_hat.Pin
の MCURST
に接続されています。MCUは7ビットアドレスの 0x14
を使用しています。
ADC¶
レジスタアドレスは3バイトで、0x170000から0x140000までがADCチャンネル0から3です。ADCの精度は12ビットで、値は0から4095までです。robot_hat.ADC
で詳細を確認してください。
アドレス |
説明 |
---|---|
|
ADCチャンネル0 |
|
ADCチャンネル1 |
|
ADCチャンネル2 |
|
ADCチャンネル3 |
|
ADCチャンネル4(バッテリーレベル) |
例:
チャンネル0のADC値を読む:
from smbus import SMBus
bus = SMBus(1)
# smbus only support 8 bit register address, so write 2 byte 0 first
bus.write_word_data(0x14, 0x17, 0)
msb = bus.read_byte(0x14)
lsb = bus.read_byte(0x14)
value = (msb << 8) | lsb
PWM¶
PWMは1バイトのレジスタと2バイトの値を持っています。
PWM周波数の変更¶
周波数はプリスケーラと周期で定義されます。
周波数を設定するには、まず設定したい周期を定義する必要があります。Arduinoでは通常255、PCA9685では4095です。
CPUクロックは72MHzです。そこから、希望の周波数に応じたプリスケーラを計算できます
プリスケーラ = 72MHz / (周期 + 1) / 周波数 - 1
周期にこだわらない場合は、周波数から周期とプリスケーラの両方を計算する方法があります。 robot_hat.PWM.freq()
を参照してください。
パルス幅¶
チャンネルのパルス幅を制御するのは簡単で、値をレジスタに書き込むだけです。
しかし 値とは何か?PWMを50%のパルス幅に設定したい場合、周期が正確に何であるかを知る必要があります。上記の計算に基づき、周期を4095に設定した場合、パルス値を2048に設定すると、約50%のパルス幅になります。
アドレス |
説明 |
---|---|
|
PWMチャンネル0 オン値 を設定 |
|
PWMチャンネル1 オン値 を設定 |
|
PWMチャンネル2の オン値 を設定 |
|
PWMチャンネル3の オン値 を設定 |
|
PWMチャンネル4の オン値 を設定 |
|
PWMチャンネル5の オン値 を設定 |
|
PWMチャンネル6の オン値 を設定 |
|
PWMチャンネル7の オン値 を設定 |
|
PWMチャンネル8の オン値 を設定 |
|
PWMチャンネル9の オン値 を設定 |
|
PWMチャンネル10の オン値 を設定 |
|
PWMチャンネル11の オン値 を設定 |
|
モーター2の速度 オン値 を設定 |
|
モーター1の速度 オン値 を設定 |
プリスケーラー¶
0x40から始まるレジスタはPWMプリスケーラーを設定するためのもので、範囲は0〜65535です。全14チャンネルに対してタイマーは4つのみです。 PWMタイマー(重要) を参照してください。
アドレス |
説明 |
---|---|
|
タイマー0の プリスケーラー を設定 |
|
タイマー1の プリスケーラー を設定 |
|
タイマー2の プリスケーラー を設定 |
|
タイマー3の プリスケーラー を設定 |
周期¶
0x44から始まるレジスタはPWM周期を設定するためのもので、範囲は0〜65535です。全14チャンネルに対してタイマーは4つのみです。 PWMタイマー(重要) を参照してください。
アドレス |
説明 |
---|---|
|
タイマー0の 周期 を設定 |
|
タイマー1の 周期 を設定 |
|
タイマー2の 周期 を設定 |
|
タイマー3の 周期 を設定 |
PWMタイマー(重要)¶
PWMタイマーとは何ですか?PWMタイマーは、PWMチャンネルをオン・オフするためのツールです。
MCUにはPWM用のタイマーが4つしかありません:つまり、同じタイマーで異なるチャンネルの周波数を設定することはできません。
例:チャンネル0に周波数を設定すると、チャンネル1、2、3に影響が及びます。チャンネル2の周波数を変更すると、チャンネル0、1、3が上書きされます。
これは、常に周波数を変更するパッシブブザーと固定周波数50Hzが必要なサーボを同時に制御したい場合のような状況です。この場合、それらを2つの異なるタイマーに分けるべきです。
タイマー |
PWMチャンネル |
---|---|
タイマー0 |
0, 1, 2, 3 |
タイマー1 |
4, 5, 6, 7 |
タイマー2 |
8, 9, 10, 11 |
タイマー3 |
12, 13(モーター用) |
例¶
from smbus import SMBus
bus = SMBus(1)
# Set timer 0 period to 4095
bus.write_word_data(0x14, 0x44, 4095)
# Set frequency to 50Hz,
freq = 50
# Calculate prescaler
prescaler = int(72000000 / (4095 + 1) / freq) - 1
# Set prescaler
bus.write_word_data(0x14, 0x40, prescaler)
# Set channel 0 to 50% pulse width
bus.write_word_data(0x14, 0x20, 2048)
MCUをリセット¶
現在のファームウェアは固定3バイトの値を読み取り、その後ADC値を返すかPWMを制御できます。そのためADCレジスタは最後の2バイトが0の3バイトが必要です。
そして、通信の途中でプログラムが中断されると、ファームウェアが固まってデータがずれる可能性があります。3バイトのデータ待ちにはタイムアウトも設定しています。
そのような場合は、MCUをリセットする必要があります。リセットするには、robot_hatコマンドを使用できます:
robot_hat reset_mcu
または、Pythonコードで行うこともできます:
from robot_hat import reset_mcu
reset_mcu()
あるいは、リセットピン(GPIO 5)を10ms引き下げてから、さらに10ms引き上げるだけで、それが reset_mcu
が行うことです。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
GPIO.output(5, GPIO.LOW)
time.sleep(0.01)
GPIO.output(5, GPIO.HIGH)
time.sleep(0.01)
参照¶
Robot Hatライブラリ
クラス Pin
¶
例
# Import Pin class
from robot_hat import Pin
# Create Pin object with numeric pin numbering and default input pullup enabled
d0 = Pin(0, Pin.IN, Pin.PULL_UP)
# Create Pin object with named pin numbering
d1 = Pin('D1')
# read value
value0 = d0.value()
value1 = d1.value()
print(value0, value1)
# write value
d0.value(1) # force input to output
d1.value(0)
# set pin high/low
d0.high()
d1.off()
# set interrupt
led = Pin('LED', Pin.OUT)
switch = Pin('SW', Pin.IN, Pin.PULL_DOWN)
def onPressed(chn):
led.value(not switch.value())
switch.irq(handler=onPressed, trigger=Pin.IRQ_RISING_FALLING)
API
- class robot_hat.Pin(pin, mode=None, pull=None, *args, **kwargs)¶
ベースクラス:
_Basic_class
ピン操作クラス
- OUT = 1¶
ピンモード出力
- IN = 2¶
ピンモード入力
- PULL_UP = 17¶
ピン内部プルアップ
- PULL_DOWN = 18¶
ピン内部プルダウン
- PULL_NONE = None¶
ピン内部プルなし
- IRQ_FALLING = 33¶
ピン割り込みフォーリング
- IRQ_RISING = 34¶
ピン割り込みフォーリング
- IRQ_RISING_FALLING = 35¶
ピン割り込みライジングとフォーリングの両方
- __init__(pin, mode=None, pull=None, *args, **kwargs)¶
ピンの初期化
- パラメータ
pin (int/str) -- Raspberry Piのピン番号
mode (int) -- ピンモード(IN/OUT)
pull (int) -- ピンプルアップ/ダウン(PUD_UP/PUD_DOWN/PUD_NONE)
- setup(mode, pull=None)¶
ピンのセットアップ
- パラメータ
mode (int) -- ピンモード(IN/OUT)
pull (int) -- ピンプルアップ/ダウン(PUD_UP/PUD_DOWN/PUD_NONE)
- dict(_dict=None)¶
ピン辞書の設定/取得
- パラメータ
_dict (dict) -- ピン辞書、辞書を取得するには空のままにしてください
- 戻り値
ピン辞書
- 戻り値の型
dict
- __call__(value)¶
ピン値の設定/取得
- パラメータ
value (int) -- ピン値、値を取得する場合は空にしておく(0/1)
- 戻り値
ピン値(0/1)
- 戻り値の型
int
- value(value: bool = None)¶
ピン値の設定/取得
- パラメータ
value (int) -- ピン値、値を取得する場合は空にしておく(0/1)
- 戻り値
ピン値(0/1)
- 戻り値の型
int
- on()¶
ピンをオン(ハイ)に設定
- 戻り値
ピン値(1)
- 戻り値の型
int
- off()¶
ピンをオフ(ロー)に設定
- 戻り値
ピン値(0)
- 戻り値の型
int
- high()¶
ピンをハイ(1)に設定
- 戻り値
ピン値(1)
- 戻り値の型
int
- low()¶
ピンをロー(0)に設定
- 戻り値
ピン値(0)
- 戻り値の型
int
- irq(handler, trigger, bouncetime=200, pull=None)¶
ピン割り込みを設定
- パラメータ
handler (function) -- 割り込みハンドラコールバック関数
trigger (int) -- 割り込みトリガー(RISING, FALLING, RISING_FALLING)
bouncetime (int) -- 割り込みバウンスタイム(ミリ秒)
- name()¶
ピン名を取得
- 戻り値
ピン名
- 戻り値の型
str
クラス ADC
¶
例
# Import ADC class
from robot_hat import ADC
# Create ADC object with numeric pin numbering
a0 = ADC(0)
# Create ADC object with named pin numbering
a1 = ADC('A1')
# Read ADC value
value0 = a0.read()
value1 = a1.read()
voltage0 = a0.read_voltage()
voltage1 = a1.read_voltage()
print(f"ADC 0 value: {value0}")
print(f"ADC 1 value: {value1}")
print(f"ADC 0 voltage: {voltage0}")
print(f"ADC 1 voltage: {voltage1}")
API
クラス PWM
¶
例
# Import PWM class
from robot_hat import PWM
# Create PWM object with numeric pin numbering and default input pullup enabled
p0 = PWM(0)
# Create PWM object with named pin numbering
p1 = PWM('P1')
# Set frequency will automatically set prescaller and period
# This is easy for device like Buzzer or LED, which you care
# about the frequency and pulse width percentage.
# this usually use with pulse_width_percent function.
# Set frequency to 1000Hz
p0.freq(1000)
print(f"Frequence: {p0.freq()} Hz")
print(f"Prescaler: {p0.prescaler()}")
print(f"Period: {p0.period()}")
# Set pulse width to 50%
p0.pulse_width_percent(50)
# Or set prescaller and period, will get a frequency from:
# frequency = PWM.CLOCK / prescaler / period
# With this setup you can tune the period as you wish.
# set prescaler to 64
p1.prescaler(64)
# set period to 4096 ticks
p1.period(4096)
print(f"Frequence: {p1.freq()} Hz")
print(f"Prescaler: {p1.prescaler()}")
print(f"Period: {p1.period()}")
# Set pulse width to 2048 which is also 50%
p1.pulse_width(2048)
API
- class robot_hat.PWM(channel, address=None, *args, **kwargs)¶
ベースクラス:
I2C
パルス幅変調(PWM)
- REG_CHN = 32¶
チャンネルレジスタの接頭辞
- REG_PSC = 64¶
プリスケーラーレジスタの接頭辞
- REG_ARR = 68¶
周期レジスタの接頭辞
- CLOCK = 72000000.0¶
クロック周波数
- __init__(channel, address=None, *args, **kwargs)¶
PWMの初期化
- パラメータ
channel (int/str) -- PWMチャンネル番号(0-13/P0-P13)
- freq(freq=None)¶
周波数の設定/取得、周波数を取得するには空白にしておく
- パラメータ
freq (float) -- 周波数(0-65535)(Hz)
- 戻り値
周波数
- 戻り値の型
float
- prescaler(prescaler=None)¶
プリスケーラーを設定/取得、プリスケーラーを取得するには空欄にしておく
- パラメータ
prescaler (int) -- プリスケーラー(0-65535)
- 戻り値
プリスケーラー
- 戻り値の型
int
- period(arr=None)¶
周期を設定/取得、周期を取得するには空欄にしておく
- パラメータ
arr (int) -- 周期(0-65535)
- 戻り値
周期
- 戻り値の型
int
- pulse_width(pulse_width=None)¶
パルス幅を設定/取得、パルス幅を取得するには空欄にしておく
- パラメータ
pulse_width (float) -- パルス幅(0-65535)
- 戻り値
パルス幅
- 戻り値の型
float
- pulse_width_percent(pulse_width_percent=None)¶
パルス幅のパーセンテージを設定/取得、パルス幅のパーセンテージを取得するには空欄にしておく
- パラメータ
pulse_width_percent (float) -- パルス幅のパーセンテージ(0-100)
- 戻り値
パルス幅のパーセンテージ
- 戻り値の型
float
クラス Servo
¶
例
# Import Servo class
from robot_hat import Servo
# Create Servo object with PWM object
servo0 = Servo("P0")
# Set servo to position 0, here 0 is the center position,
# angle ranges from -90 to 90
servo0.angle(0)
# Sweep servo from 0 to 90 degrees, then 90 to -90 degrees, finally back to 0
import time
for i in range(0, 91):
servo0.angle(i)
time.sleep(0.05)
for i in range(90, -91, -1):
servo0.angle(i)
time.sleep(0.05)
for i in range(-90, 1):
servo0.angle(i)
time.sleep(0.05)
# Servos are all controls with pulse width, some
# from 500 ~ 2500 like most from SunFounder.
# You can directly set the pulse width
# Set servo to 1500 pulse width (-90 degree)
servo0.pulse_width_time(500)
# Set servo to 1500 pulse width (0 degree)
servo0.pulse_width_time(1500)
# Set servo to 1500 pulse width (90 degree)
servo0.pulse_width_time(2500)
API
- class robot_hat.Servo(channel, address=None, *args, **kwargs)¶
ベースクラス:
PWM
サーボモータークラス
- __init__(channel, address=None, *args, **kwargs)¶
サーボモータークラスを初期化する
- パラメータ
channel (int/str) -- PWMチャンネル番号(0-14/P0-P14)
- angle(angle)¶
サーボモーターの角度を設定する
- パラメータ
angle (float) -- 角度(-90~90)
- pulse_width_time(pulse_width_time)¶
サーボモーターのパルス幅を設定する
- パラメータ
pulse_width_time (float) -- パルス幅時間(500~2500)
モジュール motor
¶
クラス Motors
¶
例
初期化
# Import Motor class
from robot_hat import Motors
# Create Motor object
motors = Motors()
モーターを直接制御します。モーター1/2はPCBのマークに従います
# Motor 1 clockwise at 100% speed
motors[1].speed(100)
# Motor 2 counter-clockwise at 100% speed
motors[2].speed(-100)
# Stop all motors
motors.stop()
ハイレベル制御の設定を行います。ハイレベル制御は、単純な前進、後退、左、右、停止から、ジョイスティック制御、モーター方向のキャリブレーションなどの複雑な機能を提供します。
注釈
これらの設定は一度だけ実行する必要があり、設定ファイルに保存されます。次にMotorsクラスをロードするときは、設定ファイルからロードされます。
# Setup left and right motors
motors.set_left_id(1)
motors.set_right_id(2)
# Go forward and see if both motor directions are correct
motors.forward(100)
# if you found a motor is running in the wrong direction
# Use these function to correct it
motors.set_left_reverse()
motors.set_right_reverse()
# Run forward again and see if both motor directions are correct
motors.forward(100)
これでロボットを制御できます
import time
motors.forward(100)
time.sleep(1)
motors.backward(100)
time.sleep(1)
motors.turn_left(100)
time.sleep(1)
motors.turn_right(100)
time.sleep(1)
motors.stop()
API
- class robot_hat.Motors(db='/root/.config/robot-hat/robot-hat.conf', *args, **kwargs)¶
ベースクラス:
_Basic_class
- __init__(db='/root/.config/robot-hat/robot-hat.conf', *args, **kwargs)¶
robot_hat.motor.Motorでモーターを初期化
- パラメータ
db (str) -- 設定ファイルのパス
- __getitem__(key)¶
特定のモーターを取得する
- stop()¶
すべてのモーターを停止する
- property left¶
左のモーター
- property right¶
右のモーター
- set_left_id(id)¶
左のモーターIDを設定します。この機能は一度だけ実行する必要があり、モーターIDを設定ファイルに保存し、クラスが初期化されるときにモーターIDをロードします。
- パラメータ
id (int) -- モーターID(1または2)
- set_right_id(id)¶
右のモーターIDを設定します。この機能は一度だけ実行する必要があり、モーターIDを設定ファイルに保存し、クラスが初期化されるときにモーターIDをロードします。
- パラメータ
id (int) -- モーターID(1または2)
- set_left_reverse()¶
左のモーターを逆回転に設定します。この機能は一度だけ実行する必要があり、逆回転の状態を設定ファイルに保存し、クラスが初期化されるときに逆回転の状態をロードします。
- 戻り値
現在逆回転しているかどうか
- 戻り値の型
bool
- set_right_reverse()¶
右のモーターを逆回転に設定します。この機能は一度だけ実行する必要があり、逆回転の状態を設定ファイルに保存し、クラスが初期化されるときに逆回転の状態をロードします。
- 戻り値
現在逆回転しているかどうか
- 戻り値の型
bool
- speed(left_speed, right_speed)¶
モーター速度を設定する
- パラメータ
left_speed (float) -- 左モーターの速度(-100.0~100.0)
right_speed (float) -- 右モーターの速度(-100.0~100.0)
- forward(speed)¶
前進
- パラメータ
speed (float) -- モーター速度(-100.0~100.0)
- backward(speed)¶
後退
- パラメータ
speed (float) -- モーター速度(-100.0~100.0)
- turn_left(speed)¶
左折
- パラメータ
speed (float) -- モーター速度(-100.0~100.0)
- turn_right(speed)¶
右折
- パラメータ
speed (float) -- モーター速度(-100.0~100.0)
クラス Motor
¶
例
# Import Motor class
from robot_hat import Motor, PWM, Pin
# Create Motor object
motor = Motor(PWM("P13"), Pin("D4"))
# Motor clockwise at 100% speed
motor.speed(100)
# Motor counter-clockwise at 100% speed
motor.speed(-100)
# If you like to reverse the motor direction
motor.set_is_reverse(True)
API
- class robot_hat.Motor(pwm, dir, is_reversed=False)¶
ベースクラス:
object
- __init__(pwm, dir, is_reversed=False)¶
モーターを初期化する
- パラメータ
pwm (robot_hat.pwm.PWM) -- モーター速度制御用PWMピン
dir (robot_hat.pin.Pin) -- モーター方向制御ピン
- speed(speed=None)¶
モーター速度の取得または設定
- パラメータ
speed (float) -- モーター速度(-100.0~100.0)
- set_is_reverse(is_reverse)¶
モーターの逆転を設定するかどうか
- パラメータ
is_reverse (bool) -- True または False
モジュール modules
¶
クラス Ultrasonic
¶
例
# Import Ultrasonic and Pin class from robot_hat import Ultrasonic, Pin # Create Motor object us = Ultrasonic(Pin("D2"), Pin("D3")) # Read distance distance = us.read() print(f"Distance: {distance}cm")API
クラス ADXL345
¶
例
# Import ADXL345 class from robot_hat import ADXL345 # Create ADXL345 object adxl = ADXL345() # or with a custom I2C address adxl = ADXL345(address=0x53) # Read acceleration of each axis x = adxl.read(adxl.X) y = adxl.read(adxl.Y) z = adxl.read(adxl.Z) print(f"Acceleration: {x}, {y}, {z}") # Or read all axis at once x, y, z = adxl.read() print(f"Acceleration: {x}, {y}, {z}") # Or print all axis at once print(f"Acceleration: {adxl.read()}")API
- class robot_hat.ADXL345(*args, address: int = 83, bus: int = 1, **kwargs)¶
ベースクラス:
I2C
ADXL345モジュール
- X = 0¶
X
- Y = 1¶
Y
- Z = 2¶
Z
- __init__(*args, address: int = 83, bus: int = 1, **kwargs)¶
ADXL345を初期化する
- パラメータ
address (int) -- ADXL345のアドレス
- read(axis: int = None) Union[float, List[float]] ¶
ADXL345から軸を読み取る
- パラメータ
axis (int) -- 軸の値(g)を読み取る、ADXL345.X、ADXL345.YまたはADXL345.Z、すべての軸の場合はNone
- 戻り値
軸の値、またはすべての軸のリスト
- 戻り値の型
float/list
クラス RGB_LED
¶
例
# Import RGB_LED and PWM class from robot_hat import RGB_LED, PWM # Create RGB_LED object for common anode RGB LED rgb = RGB_LED(PWM(0), PWM(1), PWM(2), common=RGB_LED.ANODE) # or for common cathode RGB LED rgb = RGB_LED(PWM(0), PWM(1), PWM(2), common=RGB_LED.CATHODE) # Set color with 24 bit int rgb.color(0xFF0000) # Red # Set color with RGB tuple rgb.color((0, 255, 0)) # Green # Set color with RGB List rgb.color([0, 0, 255]) # Blue # Set color with RGB hex string starts with “#” rgb.color("#FFFF00") # YellowAPI
- class robot_hat.RGB_LED(r_pin: PWM, g_pin: PWM, b_pin: PWM, common: int = 1)¶
シンプルな3ピンRGB LED
- ANODE = 1¶
共通アノード
- CATHODE = 0¶
共通カソード
- __init__(r_pin: PWM, g_pin: PWM, b_pin: PWM, common: int = 1)¶
RGB LEDを初期化する
- パラメータ
r_pin (robot_hat.PWM) -- 赤用のPWMオブジェクト
g_pin (robot_hat.PWM) -- 緑用のPWMオブジェクト
b_pin (robot_hat.PWM) -- 青用のPWMオブジェクト
common (int) -- RGB_LED.ANODEまたはRGB_LED.CATHODE、デフォルトはANODE
- 例外
ValueError -- 共通がANODEまたはCATHODEでない場合
TypeError -- r_pin、g_pin、またはb_pinがPWMオブジェクトでない場合
- color(color: Union[str, Tuple[int, int, int], List[int], int])¶
RGB LEDに色を書き込む
- パラメータ
color (str/int/tuple/list) -- 書き込む色、"#"で始まる16進数文字列、24ビット整数、または(red, green, blue)のタプル
クラス Buzzer
¶
例
インポートと初期化
# Import Buzzer class from robot_hat import Buzzer # Import Pin for active buzzer from robot_hat import Pin # Import PWM for passive buzzer from robot_hat import PWM # import Music class for tones from robot_hat import Music # Import time for sleep import time music = Music() # Create Buzzer object for passive buzzer p_buzzer = Buzzer(PWM(0)) # Create Buzzer object for active buzzer a_buzzer = Buzzer(Pin("D0"))アクティブブザーのビープ音
while True: a_buzzer.on() time.sleep(0.5) a_buzzer.off() time.sleep(0.5)パッシブブザーの簡単な使用方法
# Play a Tone for 1 second p_buzzer.play(music.note("C3"), duration=1) # take adventage of the music beat as duration # set song tempo of the beat value music.tempo(120, 1/4) # Play note with a quarter beat p_buzzer.play(music.note("C3"), music.beat(1/4))パッシブブザーの手動制御
# Play a tone p_buzzer.play(music.note("C4")) # Pause for 1 second time.sleep(1) # Play another tone p_buzzer.play(music.note("C5")) # Pause for 1 second time.sleep(1) # Stop playing p_buzzer.off()曲を演奏する!ベイビーシャーク!
music.tempo(120, 1/4) # Make a Shark-doo-doo function as is all about it def shark_doo_doo(): p_buzzer.play(music.note("C5"), music.beat(1/8)) p_buzzer.play(music.note("C5"), music.beat(1/8)) p_buzzer.play(music.note("C5"), music.beat(1/8)) p_buzzer.play(music.note("C5"), music.beat(1/16)) p_buzzer.play(music.note("C5"), music.beat(1/16 + 1/16)) p_buzzer.play(music.note("C5"), music.beat(1/16)) p_buzzer.play(music.note("C5"), music.beat(1/8)) # loop any times you want from baby to maybe great great great grandpa! for _ in range(3): print("Measure 1") p_buzzer.play(music.note("G4"), music.beat(1/4)) p_buzzer.play(music.note("A4"), music.beat(1/4)) print("Measure 2") shark_doo_doo() p_buzzer.play(music.note("G4"), music.beat(1/8)) p_buzzer.play(music.note("A4"), music.beat(1/8)) print("Measure 3") shark_doo_doo() p_buzzer.play(music.note("G4"), music.beat(1/8)) p_buzzer.play(music.note("A4"), music.beat(1/8)) print("Measure 4") shark_doo_doo() p_buzzer.play(music.note("C5"), music.beat(1/8)) p_buzzer.play(music.note("C5"), music.beat(1/8)) print("Measure 5") p_buzzer.play(music.note("B4"), music.beat(1/4)) time.sleep(music.beat(1/4))API
- class robot_hat.Buzzer(buzzer: Union[PWM, Pin])¶
- __init__(buzzer: Union[PWM, Pin])¶
ブザーを初期化する
- パラメータ
pwm (robot_hat.PWM/robot_hat.Pin) -- パッシブブザー用のPWMオブジェクトまたはアクティブブザー用のピンオブジェクト
- on()¶
ブザーをオンにする
- off()¶
ブザーをオフにする
- freq(freq: float)¶
パッシブブザーの周波数を設定する
- パラメータ
freq (int/float) -- ブザーの周波数、Music.NOTESを使用して音符の周波数を取得する
- 例外
TypeError -- アクティブブザーに設定した場合
- play(freq: float, duration: float = None)¶
周波数を演奏する
- パラメータ
freq (float) -- 演奏する周波数、Music.note()を使用して音符の周波数を取得できる
duration (float) -- 各音符の持続時間(秒)、Noneは連続して演奏することを意味する
- 例外
TypeError -- アクティブブザーに設定した場合
クラス Grayscale_Module
¶
例
# Import Grayscale_Module and ADC class from robot_hat import Grayscale_Module, ADC # Create Grayscale_Module object, reference should be calculate from the value reads on white # and black ground, then take the middle as reference gs = Grayscale_Module(ADC(0), ADC(1), ADC(2), reference=2000) # Read Grayscale_Module datas datas = gs.read() print(f"Grayscale Module datas: {datas}") # or read a specific channel l = gs.read(gs.LEFT) m = gs.read(gs.MIDDLE) r = gs.read(gs.RIGHT) print(f"Grayscale Module left channel: {l}") print(f"Grayscale Module middle channel: {m}") print(f"Grayscale Module right channel: {r}") # Read Grayscale_Module simple states state = gs.read_status() print(f"Grayscale_Module state: {state}")API
- class robot_hat.Grayscale_Module(pin0: ADC, pin1: ADC, pin2: ADC, reference: int = None)¶
3チャンネルグレースケールモジュール
- LEFT = 0¶
左チャンネル
- MIDDLE = 1¶
中央チャンネル
- RIGHT = 2¶
右チャンネル
- __init__(pin0: ADC, pin1: ADC, pin2: ADC, reference: int = None)¶
グレースケールモジュールを初期化する
- パラメータ
pin0 (robot_hat.ADC/int) -- チャンネル0用のADCオブジェクトまたは整数
pin1 (robot_hat.ADC/int) -- チャンネル1用のADCオブジェクトまたは整数
pin2 (robot_hat.ADC/int) -- チャンネル2用のADCオブジェクトまたは整数
reference (1*3 list, [int, int, int]) -- 基準電圧
- reference(ref: list = None) list ¶
基準値の取得と設定
- パラメータ
ref (list) -- 基準値、基準値を取得する場合はNone
- 戻り値
基準値
- 戻り値の型
list
- read_status(datas: list = None) list ¶
ライン状態の読み取り
- パラメータ
datas (list) -- グレースケールデータのリスト、Noneの場合はセンサーから読み取り
- 戻り値
ライン状態のリスト、0は白、1は黒
- 戻り値の型
list
- read(channel: int = None) list ¶
チャンネルまたはすべてのデータを読み取る
- パラメータ
channel (int/None) -- 読み取るチャンネル、すべてを読み取るには空のままにする。0、1、2またはGrayscale_Module.LEFT、Grayscale_Module.CENTER、Grayscale_Module.RIGHT
- 戻り値
グレースケールデータのリスト
- 戻り値の型
list
クラス Robot
¶
例
# Import Robot class
from robot import Robot
# Create a robot(PiSloth)
robot = Robot(pin_list=[0, 1, 2, 3], name="pisloth")
robot.move_list["forward"] = [
[0, 40, 0, 15],
[-30, 40, -30, 15],
[-30, 0, -30, 0],
[0, -15, 0, -40],
[30, -15, 30, -40],
[30, 0, 30, 0],
]
robot.do_action("forward", step=3, speed=90)
API
- class robot_hat.Robot(pin_list, db='/root/.config/robot-hat/robot-hat.conf', name=None, init_angles=None, init_order=None, **kwargs)¶
ベースクラス:
_Basic_class
ロボットクラス
このクラスはRobot HATを使ってサーボロボットを作るためのものです
サーボの初期化、全サーボが特定の速度で動くこと、サーボのオフセットなどがあり、ロボットを作りやすくなっています。SunFounderのPiシリーズロボットはすべてこのクラスを使用しています。詳細はそれらをチェックしてください。
PiSloth: https://github.com/sunfounder/pisloth
PiArm: https://github.com/sunfounder/piarm
PiCrawler: https://github.com/sunfounder/picrawler
- move_list = {}¶
プリセットアクション
- max_dps = 428¶
サーボの最大度/秒
- __init__(pin_list, db='/root/.config/robot-hat/robot-hat.conf', name=None, init_angles=None, init_order=None, **kwargs)¶
ロボットクラスを初期化する
- パラメータ
pin_list (list) -- ピン番号のリスト[0-11]
db (str) -- 設定ファイルのパス
name (str) -- ロボットの名前
init_angles (list) -- 初期角度のリスト
init_order (list) -- 初期化の順序のリスト(突然の大電流の場合、サーボは1つずつ初期化され、電源電圧が下がることがあります。デフォルトの順序はピンリストです。場合によっては異なる順序が必要です。このパラメータを使用して設定してください。)
- new_list(default_value)¶
デフォルト値でサーボ角度のリストを作成する
- パラメータ
default_value (int or float) -- サーボ角度のデフォルト値
- 戻り値
サーボ角度のリスト
- 戻り値の型
list
- servo_write_raw(angle_list)¶
サーボ角度を特定の生の角度に設定する
- パラメータ
angle_list (list) -- サーボ角度のリスト
- servo_write_all(angles)¶
元の角度とオフセットを使ってサーボ角度を特定の角度に設定する
- パラメータ
angles (list) -- サーボ角度のリスト
- servo_move(targets, speed=50, bpm=None)¶
速度またはBPMでサーボを特定の角度に動かす
- パラメータ
targets (list) -- サーボ角度のリスト
speed (int or float) -- サーボ移動の速度
bpm (int or float) -- 分あたりの拍数
- do_action(motion_name, step=1, speed=50)¶
動作名とステップと速度を使ってプレフィックスアクションを実行する
- パラメータ
motion_name (str) -- 動作
step (int) -- 動作のステップ
speed (int or float) -- 動作の速度
- set_offset(offset_list)¶
サーボ角度のオフセットを設定する
- パラメータ
offset_list (list) -- サーボ角度のリスト
- calibration()¶
全てのサーボをホームポジションに動かす
- reset()¶
サーボを元の位置にリセットする
クラス Music
¶
警告
スピーカーが動作しない場合、このスクリプトを実行する際には
sudo
を追加する必要があります。
例
初期化
# Import Music class
from robot_hat import Music
# Create a new Music object
music = Music()
トーンを演奏する
# You can directly play a frequency for specific duration in seconds
music.play_tone_for(400, 1)
# Or use note to get the frequency
music.play_tone_for(music.note("Middle C"), 0.5)
# and set tempo and use beat to get the duration in seconds
# Which make's it easy to code a song according to a sheet!
music.tempo(120)
music.play_tone_for(music.note("Middle C"), music.beat(1))
# Here's an example playing Greensleeves
set_volume(80)
music.tempo(60, 1/4)
print("Measure 1")
music.play_tone_for(music.note("G4"), music.beat(1/8))
print("Measure 2")
music.play_tone_for(music.note("A#4"), music.beat(1/4))
music.play_tone_for(music.note("C5"), music.beat(1/8))
music.play_tone_for(music.note("D5"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("D#5"), music.beat(1/16))
music.play_tone_for(music.note("D5"), music.beat(1/8))
print("Measure 3")
music.play_tone_for(music.note("C5"), music.beat(1/4))
music.play_tone_for(music.note("A4"), music.beat(1/8))
music.play_tone_for(music.note("F4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("G4"), music.beat(1/16))
music.play_tone_for(music.note("A4"), music.beat(1/8))
print("Measure 4")
music.play_tone_for(music.note("A#4"), music.beat(1/4))
music.play_tone_for(music.note("G4"), music.beat(1/8))
music.play_tone_for(music.note("G4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("F#4"), music.beat(1/16))
music.play_tone_for(music.note("G4"), music.beat(1/8))
print("Measure 5")
music.play_tone_for(music.note("A4"), music.beat(1/4))
music.play_tone_for(music.note("F#4"), music.beat(1/8))
music.play_tone_for(music.note("D4"), music.beat(1/4))
music.play_tone_for(music.note("G4"), music.beat(1/8))
print("Measure 6")
music.play_tone_for(music.note("A#4"), music.beat(1/4))
music.play_tone_for(music.note("C5"), music.beat(1/8))
music.play_tone_for(music.note("D5"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("D#5"), music.beat(1/16))
music.play_tone_for(music.note("D5"), music.beat(1/8))
print("Measure 7")
music.play_tone_for(music.note("C5"), music.beat(1/4))
music.play_tone_for(music.note("A4"), music.beat(1/8))
music.play_tone_for(music.note("F4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("G4"), music.beat(1/16))
music.play_tone_for(music.note("A4"), music.beat(1/8))
print("Measure 8")
music.play_tone_for(music.note("A#4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("A4"), music.beat(1/16))
music.play_tone_for(music.note("G4"), music.beat(1/8))
music.play_tone_for(music.note("F#4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("E4"), music.beat(1/16))
music.play_tone_for(music.note("F#4"), music.beat(1/8))
print("Measure 9")
music.play_tone_for(music.note("G4"), music.beat(1/4 + 1/8))
music.play_tone_for(music.note("G4"), music.beat(1/4 + 1/8))
print("Measure 10")
music.play_tone_for(music.note("F5"), music.beat(1/4 + 1/8))
music.play_tone_for(music.note("F5"), music.beat(1/8))
music.play_tone_for(music.note("E5"), music.beat(1/16))
music.play_tone_for(music.note("D5"), music.beat(1/8))
print("Measure 11")
music.play_tone_for(music.note("C5"), music.beat(1/4))
music.play_tone_for(music.note("A4"), music.beat(1/8))
music.play_tone_for(music.note("F4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("G4"), music.beat(1/16))
music.play_tone_for(music.note("A4"), music.beat(1/8))
print("Measure 12")
music.play_tone_for(music.note("A#4"), music.beat(1/4))
music.play_tone_for(music.note("G4"), music.beat(1/8))
music.play_tone_for(music.note("G4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("F#4"), music.beat(1/16))
music.play_tone_for(music.note("G4"), music.beat(1/8))
print("Measure 13")
music.play_tone_for(music.note("A4"), music.beat(1/4))
music.play_tone_for(music.note("F#4"), music.beat(1/8))
music.play_tone_for(music.note("D4"), music.beat(1/4 + 1/8))
print("Measure 14")
music.play_tone_for(music.note("F5"), music.beat(1/4 + 1/8))
music.play_tone_for(music.note("F5"), music.beat(1/8))
music.play_tone_for(music.note("E5"), music.beat(1/16))
music.play_tone_for(music.note("D5"), music.beat(1/8))
print("Measure 15")
music.play_tone_for(music.note("C5"), music.beat(1/4))
music.play_tone_for(music.note("A4"), music.beat(1/8))
music.play_tone_for(music.note("F4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("G4"), music.beat(1/16))
music.play_tone_for(music.note("A4"), music.beat(1/8))
print("Measure 16")
music.play_tone_for(music.note("A#4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("A4"), music.beat(1/16))
music.play_tone_for(music.note("G4"), music.beat(1/8))
music.play_tone_for(music.note("F#4"), music.beat(1/8 + 1/16))
music.play_tone_for(music.note("E4"), music.beat(1/16))
music.play_tone_for(music.note("F#4"), music.beat(1/8))
print("Measure 17")
music.play_tone_for(music.note("G4"), music.beat(1/4 + 1/8))
music.play_tone_for(music.note("G4"), music.beat(1/4 + 1/8))
サウンドを演奏する
# Play a sound
music.sound_play("file.wav", volume=50)
# Play a sound in the background
music.sound_play_threading("file.wav", volume=80)
# Get sound length
music.sound_length("file.wav")
音楽を演奏する
# Play music
music.music_play("file.mp3")
# Play music in loop
music.music_play("file.mp3", loop=0)
# Play music in 3 times
music.music_play("file.mp3", loop=3)
# Play music in starts from 2 second
music.music_play("file.mp3", start=2)
# Set music volume
music.music_set_volume(50)
# Stop music
music.music_stop()
# Pause music
music.music_pause()
# Resume music
music.music_resume()
API
- class robot_hat.Music¶
ベースクラス:
_Basic_class
音楽、サウンドエフェクト、音符の制御を演奏する
- NOTE_BASE_FREQ = 440¶
計算用の基準音の周波数(A4)
- NOTE_BASE_INDEX = 69¶
計算用の基準音のインデックス(A4)MIDI互換
- NOTES = [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'A0', 'A#0', 'B0', 'C1', 'C#1', 'D1', 'D#1', 'E1', 'F1', 'F#1', 'G1', 'G#1', 'A1', 'A#1', 'B1', 'C2', 'C#2', 'D2', 'D#2', 'E2', 'F2', 'F#2', 'G2', 'G#2', 'A2', 'A#2', 'B2', 'C3', 'C#3', 'D3', 'D#3', 'E3', 'F3', 'F#3', 'G3', 'G#3', 'A3', 'A#3', 'B3', 'C4', 'C#4', 'D4', 'D#4', 'E4', 'F4', 'F#4', 'G4', 'G#4', 'A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5', 'F5', 'F#5', 'G5', 'G#5', 'A5', 'A#5', 'B5', 'C6', 'C#6', 'D6', 'D#6', 'E6', 'F6', 'F#6', 'G6', 'G#6', 'A6', 'A#6', 'B6', 'C7', 'C#7', 'D7', 'D#7', 'E7', 'F7', 'F#7', 'G7', 'G#7', 'A7', 'A#7', 'B7', 'C8']¶
音符の名前、MIDI互換
- __init__()¶
基本クラスを初期化する
- パラメータ
debug_level (str/int) -- デバッグレベル、0(クリティカル)、1(エラー)、2(警告)、3(情報)または4(デバッグ)
- time_signature(top: int = None, bottom: int = None)¶
拍子記号の設定/取得
- パラメータ
top (int) -- 拍子記号の上部の数字
bottom (int) -- 拍子記号の下部の数字
- 戻り値
拍子記号
- 戻り値の型
tuple
- key_signature(key: int = None)¶
キー記号の設定/取得
- パラメータ
key (int/str) -- キー記号はKEY_XX_MAJORまたは「#」、「##」、「bbb」、「bbbb」の文字列を使用
- 戻り値
キー記号
- 戻り値の型
int
- tempo(tempo=None, note_value=0.25)¶
テンポ(分あたりの拍数)の設定/取得
- パラメータ
tempo (float) -- テンポ
note_value -- 音価(1、1/2、Music.HALF_NOTEなど)
- 戻り値
テンポ
- 戻り値の型
int
- beat(beat)¶
テンポから拍子の遅延を秒単位で計算する
- パラメータ
beat (float) -- 拍子インデックス
- 戻り値
拍子の遅延
- 戻り値の型
float
- note(note, natural=False)¶
音符の周波数を取得する
- パラメータ
note_name (string) -- 音符の名前(NOTES参照)
natural (bool) -- ナチュラルノートの場合
- 戻り値
音符の周波数
- 戻り値の型
float
- sound_play(filename, volume=None)¶
サウンドエフェクトファイルを再生する
- パラメータ
filename (str) -- サウンドエフェクトファイル名
- sound_play_threading(filename, volume=None)¶
サウンドエフェクトをスレッドで再生する(バックグラウンドで)
- パラメータ
filename (str) -- サウンドエフェクトファイル名
volume (int) -- 音量0-100、空欄にすると音量は変わらない
- music_play(filename, loops=1, start=0.0, volume=None)¶
音楽ファイルを再生する
- パラメータ
filename (str) -- サウンドファイル名
loops (int) -- ループ回数、0:無限ループ、1:1回再生、2:2回再生、...
start (float) -- 開始時間(秒)
volume (int) -- 音量0-100、空欄にすると音量は変わらない
- music_set_volume(value)¶
音楽の音量を設定する
- パラメータ
value (int) -- 音量 0-100
- music_stop()¶
音楽を停止する
- music_pause()¶
音楽を一時停止する
- music_resume()¶
音楽を再開する
- music_unpause()¶
音楽の一時停止を解除する(音楽を再開する)
- sound_length(filename)¶
サウンドエフェクトの長さを秒で取得する
- パラメータ
filename (str) -- サウンドエフェクトファイル名
- 戻り値
長さ(秒)
- 戻り値の型
float
- get_tone_data(freq: float, duration: float)¶
演奏用のトーンデータを取得する
- パラメータ
freq (float) -- 周波数
duration (float) -- 持続時間(秒)
- 戻り値
トーンデータ
- 戻り値の型
list
- play_tone_for(freq, duration)¶
指定された持続時間のトーンを演奏する
- パラメータ
freq (float) -- 周波数、NOTESを使用して周波数を取得できる
duration (float) -- 持続時間(秒)
クラス TTS
¶
警告
スピーカーが動作しない場合、このスクリプトを実行する際には
sudo
を追加する必要があります。
例
# Import TTS class
from robot_hat import TTS
# Initialize TTS class
tts = TTS(lang='en-US')
# Speak text
tts.say("Hello World")
# show all supported languages
print(tts.supported_lang())
API
- class robot_hat.TTS(engine='pico2wave', lang=None, *args, **kwargs)¶
ベースクラス:
_Basic_class
テキストから音声への変換クラス
- SUPPORTED_LANGUAUE = ['en-US', 'en-GB', 'de-DE', 'es-ES', 'fr-FR', 'it-IT']¶
pico2waveのためのサポートされているTTS言語
- ESPEAK = 'espeak'¶
espeak TTSエンジン
- PICO2WAVE = 'pico2wave'¶
pico2wave TTSエンジン
- __init__(engine='pico2wave', lang=None, *args, **kwargs)¶
TTSクラスを初期化する。
- パラメータ
engine (str) -- TTSエンジン、TTS.PICO2WAVEまたはTTS.ESPEAK
- say(words)¶
言葉を話す。
- パラメータ
words (str) -- 話す言葉。
- espeak(words)¶
espeakで言葉を話す。
- パラメータ
words (str) -- 話す言葉。
- pico2wave(words)¶
pico2waveで言葉を話す。
- パラメータ
words (str) -- 話す言葉。
- lang(*value)¶
言語を設定/取得する。現在の言語を取得するために空のままにする。
- パラメータ
value (str) -- 言語。
- supported_lang()¶
サポートされている言語を取得する。
- 戻り値
サポートされている言語。
- 戻り値の型
list
- espeak_params(amp=None, speed=None, gap=None, pitch=None)¶
espeakのパラメータを設定する。
- パラメータ
amp (int) -- 振幅。
speed (int) -- 速度。
gap (int) -- ギャップ。
pitch (int) -- ピッチ。
モジュール utils
¶
- robot_hat.utils.set_volume(value)¶
音量を設定する
- パラメータ
value (int) -- 音量(0〜100)
- robot_hat.utils.run_command(cmd)¶
コマンドを実行し、状態と出力を返す
- パラメータ
cmd (str) -- 実行するコマンド
- 戻り値
状態、出力
- 戻り値の型
tuple
- robot_hat.utils.is_installed(cmd)¶
コマンドがインストールされているかどうかを確認する
- パラメータ
cmd (str) -- 確認するコマンド
- 戻り値
インストールされている場合はTrue
- 戻り値の型
bool
- robot_hat.utils.mapping(x, in_min, in_max, out_min, out_max)¶
ある範囲の値を別の範囲にマップする
- パラメータ
x (float/int) -- マップする値
in_min (float/int) -- 入力最小値
in_max (float/int) -- 入力最大値
out_min (float/int) -- 出力最小値
out_max (float/int) -- 出力最大値
- 戻り値
マップされた値
- 戻り値の型
float/int
- robot_hat.utils.get_ip(ifaces=['wlan0', 'eth0'])¶
IPアドレスを取得する
- パラメータ
ifaces (list) -- チェックするインターフェース
- 戻り値
見つかった場合はIPアドレス、見つからない場合はFalse
- 戻り値の型
str/False
- robot_hat.utils.reset_mcu()¶
Robot Hat上のMCUをリセットする。
これは、MCUが何らかの理由でI2Cデータ転送ループに固まり、Raspberry PiがADCの読み取り、PWMの操作などでIOErrorを取得している場合に役立ちます。
- robot_hat.utils.get_battery_voltage()¶
バッテリー電圧を取得する
- 戻り値
バッテリー電圧(V)
- 戻り値の型
float
クラス FileDB
¶
例
# Import fileDB class
from robot_hat import fileDB
# Create fileDB object with a config file
db = fileDB("./config")
# Set some values
db.set("apple", "10")
db.set("orange", "5")
db.set("banana", "13")
# Read the values
print(db.get("apple"))
print(db.get("orange"))
print(db.get("banana"))
# Read an none existing value with a default value
print(db.get("pineapple", default_value="-1"))
これでbashで設定ファイル config
を確認できます。
cat config
API
- class robot_hat.fileDB(db: str, mode: str = None, owner: str = None)¶
ベースクラス:
object
ファイルベースのデータベース。
特定のファイルで引数を読み書きするファイルベースのデータベースです。
- __init__(db: str, mode: str = None, owner: str = None)¶
db_fileを初期化すると、データを保存するファイルになります。
- パラメータ
db (str) -- データを保存するファイル。
mode (str) -- ファイルのモード。
owner (str) -- ファイルの所有者。
- file_check_create(file_path: str, mode: str = None, owner: str = None)¶
ファイルが存在するかチェックし、存在しない場合は作成する。
- パラメータ
file_path (str) -- チェックするファイル
mode (str) -- ファイルのモード。
owner (str) -- ファイルの所有者。
- get(name, default_value=None)¶
データの名前で値を取得する
- パラメータ
name (str) -- 引数の名前
default_value (str) -- 引数のデフォルト値
- 戻り値
引数の値
- 戻り値の型
str
- set(name, value)¶
名前で値を設定する。または、引数が存在しない場合は作成する
- パラメータ
name (str) -- 引数の名前
value (str) -- 引数の値
クラス I2C
¶
例
# Import the I2C class
from robot_hat import I2C
# You can scan for available I2C devices
print([f"0x{addr:02X}" for addr in I2C().scan()])
# You should see at least one device address 0x14, which is the
# on board MCU for PWM and ADC
# Initialize a I2C object with device address, for example
# to communicate with on board MCU 0x14
mcu = I2C(0x14)
# Send ADC channel register to read ADC, 0x10 is Channel 0, 0x11 is Channel 1, etc.
mcu.write([0x10, 0x00, 0x00])
# Read 2 byte for MSB and LSB
msb, lsb = mcu.read(2)
# Convert to integer
value = (msb << 8) + lsb
# Print the value
print(value)
I2Cプロトコルの詳細については、adc.pyとpwm.pyをご覧ください
API
- class robot_hat.I2C(address=None, bus=1, *args, **kwargs)¶
ベースクラス:
_Basic_class
I2Cバスの読み書き機能
- __init__(address=None, bus=1, *args, **kwargs)¶
I2Cバスを初期化する
- パラメータ
address (int) -- I2Cデバイスアドレス
bus (int) -- I2Cバス番号
- scan()¶
I2Cバスをスキャンしてデバイスを検出する
- 戻り値
見つかったデバイスのI2Cアドレスのリスト
- 戻り値の型
list
- write(data)¶
I2Cデバイスにデータを書き込む
- パラメータ
data (int/list/bytearray) -- 書き込むデータ
- 例外
書き込みがint、リスト、またはバイト配列でない場合はValueError
- read(length=1)¶
I2Cデバイスからデータを読み取る
- パラメータ
length (int) -- 受信するバイト数
- 戻り値
受信したデータ
- 戻り値の型
list
- mem_write(data, memaddr)¶
特定のレジスタアドレスにデータを送信する
- パラメータ
data (int/list/bytearray) -- 送信するデータ、int、リスト、またはバイト配列
memaddr (int) -- レジスタアドレス
- 例外
ValueError -- データがint、リスト、またはバイト配列でない場合
- mem_read(length, memaddr)¶
特定のレジスタアドレスからデータを読み取る
- パラメータ
length (int) -- 受信するバイト数
memaddr (int) -- レジスタアドレス
- 戻り値
エラーがない場合は受信したバイト配列データ、エラーがある場合はFalse
- 戻り値の型
list/False
- is_avaliable()¶
I2Cデバイスが利用可能かどうかを確認する
- 戻り値
I2Cデバイスが利用可能な場合はTrue、そうでない場合はFalse
- 戻り値の型
bool
クラス _Basic_class
¶
_Basic_class
はすべてのクラスのロガークラスで、特定のクラスのログを見たい場合は、デバッグ引数を追加するだけです。
例
# See PWM log
from robot_hat import PWM
# init the class with a debug argument
pwm = PWM(0, debug_level="debug")
# run some functions and see logs
pwm.freq(1000)
pwm.pulse_width_percent(100)
API
- class robot_hat.basic._Basic_class(debug_level='warning')¶
すべてのクラスの基本クラス
デバッグ機能付き
- DEBUG_LEVELS = {'critical': 50, 'debug': 10, 'error': 40, 'info': 20, 'warning': 30}¶
デバッグレベル
- DEBUG_NAMES = ['critical', 'error', 'warning', 'info', 'debug']¶
デバッグレベルの名称
- __init__(debug_level='warning')¶
基本クラスを初期化する
- パラメータ
debug_level (str/int) -- デバッグレベル、0(重大)、1(エラー)、2(警告)、3(情報)または4(デバッグ)
- property debug_level¶
デバッグレベル
いくつかのプロジェクト¶
ここでは、Robot HATを使用して実装された魅力的なプロジェクトのコレクションを紹介します。詳細なコードを提供し、これらのプロジェクトを自分で試す機会を提供します。
サーボとモーターの制御¶
このプロジェクトでは、12個のサーボと2つのモーターが同時に動作します。

ただし、サーボやモーターの始動電流が高い場合は、それらを個別に起動して、電源電流不足を避けることをお勧めします。電流不足はRaspberry Piの再起動につながる可能性があります。
コード
from robot_hat import Servo, Motors
import time
# Create objects for 12 servos
servos = [Servo(f"P{i}") for i in range(12)]
# Create motor object
motors = Motors()
def initialize_servos():
"""Set initial angle of all servos to 0."""
for servo in servos:
servo.angle(-90)
time.sleep(0.1) # Wait for servos to reach the initial position
time.sleep(1)
def sweep_servos(angle_from, angle_to, step):
"""Control all servos to sweep from a start angle to an end angle."""
if angle_from < angle_to:
range_func = range(angle_from, angle_to + 1, step)
else:
range_func = range(angle_from, angle_to - 1, -step)
for angle in range_func:
for servo in servos:
servo.angle(angle)
time.sleep(0.05)
def control_motors_and_servos():
"""Control motors and servos in synchronization."""
try:
while True:
# Motors rotate forward and servos sweep from -90 to 90 degrees
motors[1].speed(80)
time.sleep(0.01)
motors[2].speed(80)
time.sleep(0.01)
sweep_servos(-90, 90, 5)
time.sleep(1)
# Motors rotate backward and servos sweep from 90 to -90 degrees
motors[1].speed(-80)
time.sleep(0.01)
motors[2].speed(-80)
time.sleep(0.01)
sweep_servos(90, -90, 5)
time.sleep(1)
except KeyboardInterrupt:
# Stop motors when Ctrl+C is pressed
motors.stop()
print("Motors stopped.")
# Initialize servos to their initial position
initialize_servos()
# Control motors and servos
control_motors_and_servos()
DIYカー¶
シンプルな実験に適しているだけでなく、スマートカーなどのロボティクスにおける中央コントローラとしても、Robot HATは理想的です。
このプロジェクトでは、シンプルなラインフォローイングカーを作りました。

コード
from robot_hat import Motors, Pin
import time
# Create motor object
motors = Motors()
# Initialize line tracking sensor
line_track = Pin('D0')
def main():
while True:
# print("value", line_track.value())
# time.sleep(0.01)
if line_track.value() == 1:
# If line is detected
motors[1].speed(-60) # Motor 1 forward
motors[2].speed(20) # Motor 2 backward
time.sleep(0.01)
else:
# If line is not detected
motors[1].speed(-20) # Motor 1 backward
motors[2].speed(60) # Motor 2 forward
time.sleep(0.01)
def destroy():
# Stop motors when Ctrl+C is pressed
motors.stop()
print("Motors stopped.")
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
destroy()
フォトレジスタモジュールから読み取る¶
このプロジェクトでは、光の強度を検出し、I2C LCD1602に表示します。

手順
このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。
cd ~/ wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
I2C用に
smbus2
をインストールします。sudo pip3 install smbus2
以下のコードをRaspberry Piに保存し、例えば
photoresistor.ty
のような名前を付けます。from robot_hat import ADC import LCD1602 import time # Create an ADC object to read the value from the photoresistor a0 = ADC(0) def setup(): # Initialize the LCD1602 LCD1602.init(0x27, 1) time.sleep(2) def destroy(): # Clear the LCD display LCD1602.clear() def loop(): while True: # Read the value from the photoresistor value0 = a0.read() # Display the read value on the LCD LCD1602.write(0, 0, 'Value: %d ' % value0) # Reduce the refresh rate to update once per second time.sleep(0.2) if __name__ == '__main__': setup() try: loop() except KeyboardInterrupt: destroy() except Exception as e: # Clear the LCD and print error message in case of an exception destroy() print("Error:", e)
このコードを実行するには、コマンド
sudo python3 photoresistor.ty
を使用します。
超音波モジュールからの読み取り¶
このプロジェクトでは、超音波センサーを使用して距離を測定し、その読み取り値をI2C LCD1602に表示します。

手順
このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。
cd ~/ wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
I2C用に
smbus2
をインストールします。sudo pip3 install smbus2
以下のコードをRaspberry Piに保存し、例えば
ultrasonic.ty
という名前を付けます。from robot_hat import ADC, Ultrasonic, Pin import LCD1602 import time # Create ADC object for photoresistor a0 = ADC(0) # Create Ultrasonic object us = Ultrasonic(Pin("D2"), Pin("D3")) //Trig to digital pin 2, echo to pin 3 def setup(): # Initialize LCD1602 LCD1602.init(0x27, 1) # Initial message on LCD LCD1602.write(0, 0, 'Measuring...') time.sleep(2) def destroy(): # Clear the LCD display LCD1602.clear() def loop(): while True: # Read distance from ultrasonic sensor distance = us.read() # Display the distance on the LCD if distance != -1: # Display the valid distance on the LCD LCD1602.write(0, 0, 'Dist: %.2f cm ' % distance) # Update every 0.5 seconds time.sleep(0.2) if __name__ == '__main__': setup() try: loop() except KeyboardInterrupt: destroy() except Exception as e: # Clear the LCD and print error message in case of an exception destroy() print("Error:", e)
このコードを実行するには、
sudo python3 ultrasonic.ty
コマンドを使用します。
プラントモニター¶
このプロジェクトでは、光の強度と土壌の水分レベルの両方を検出し、I2C LCD1602に表示します。土壌の水分が不足していると感じたら、ボタンモジュールを押して鉢植えに水をやることができます。

手順
このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。
cd ~/ wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
I2C用に
smbus2
をインストールします。sudo pip3 install smbus2
以下のコードをRaspberry Piに保存し、例えば
plant_monitor.ty
という名前を付けます。from robot_hat import ADC, Motors, Pin import LCD1602 import time import threading from robot_hat.utils import reset_mcu reset_mcu() time.sleep(.1) # Initialize objects light_sensor = ADC(1) moisture_sensor = ADC(0) motors = Motors() button = Pin('D0') # Thread running flag running = True def init_lcd(): LCD1602.init(0x27, 1) time.sleep(2) def update_lcd(light_value, moisture_value): LCD1602.write(0, 0, 'Light: %d ' % light_value) LCD1602.write(0, 1, 'Moisture: %d ' % moisture_value) def read_sensors(): light_value = light_sensor.read() time.sleep(0.2) moisture_value = moisture_sensor.read() time.sleep(0.2) return light_value, moisture_value def control_motor(): global running while running: button_pressed = button.value() == 0 if button_pressed: motors[1].speed(80) time.sleep(0.1) else: motors[1].speed(0) time.sleep(0.1) time.sleep(0.1) def setup(): init_lcd() def destroy(): global running running = False LCD1602.clear() def loop(): global running while running: light_value, moisture_value = read_sensors() update_lcd(light_value, moisture_value) time.sleep(.2) if __name__ == '__main__': try: setup() motor_thread = threading.Thread(target=control_motor) motor_thread.start() loop() except KeyboardInterrupt: motor_thread.join() # Wait for motor_thread to finish print("Program stopped") except Exception as e: print("Error:", e) finally: motors[1].speed(0) time.sleep(.1) destroy() print('end')
このコードを実行するには、
sudo python3 plant_monitor.ty
コマンドを使用します。
何かを話す¶
このセクションでは、テキストを音声に変換して、Robot HATに大声で話させる方法を学びます。
手順
コマンドラインからテキストを取得してRobot HATがそれを話すようにします。これを実現するために、以下のコードを
.py
ファイルとして保存します。例えばtts.py
などです。import sys from robot_hat import TTS # Check if there are enough command line arguments if len(sys.argv) > 1: text_to_say = sys.argv[1] # Get the first argument passed from the command line else: text_to_say = "Hello SunFounder" # Default text if no arguments are provided # Initialize the TTS class tts = TTS(lang='en-US') # Read the text tts.say(text_to_say) # Display all supported languages print(tts.supported_lang())
Robot HATに特定の文章を発声させるには、次のコマンドを使用します:
sudo python3 tts.py "任意のテキスト"
- 単に"任意のテキスト"
を希望のフレーズに置き換えてください。
セキュリティシステム¶
このプロジェクトでは、シンプルなセキュリティシステムを作成しました。PIRセンサーが人の動きを検出すると、カメラが起動します。顔が検出されると、写真を撮り、同時に警告メッセージを発信します。

手順
顔検出のための
vilib
ライブラリをインストールします。cd ~/ git clone -b picamera2 https://github.com/sunfounder/vilib.git cd vilib sudo python3 install.py
以下のコードをRaspberry Piに保存し、例えば
security.ty
という名前を付けます。import os from time import sleep, time, strftime, localtime from vilib import Vilib from robot_hat import Pin, TTS # Initialize the TTS class tts = TTS(lang='en-US') # Display all supported languages print(tts.supported_lang()) # Initialize the PIR sensor pir = Pin('D0') def camera_start(): Vilib.camera_start() Vilib.display() Vilib.face_detect_switch(True) def take_photo(): _time = strftime('%Y-%m-%d-%H-%M-%S', localtime(time())) name = f'photo_{_time}' username = os.getlogin() path = f"/home/{username}/Pictures/" Vilib.take_photo(name, path) print(f'Photo saved as {path}{name}.jpg') def main(): motion_detected = False while True: # Check for motion if pir.value() == 1: if not motion_detected: print("Motion detected! Initializing camera...") camera_start() motion_detected = True sleep(2) # Stabilization delay to confirm motion # Check for human face and take a photo if Vilib.detect_obj_parameter['human_n'] != 0: take_photo() # Read the text tts.say("Security alert: Unrecognized Individual detected. Please verify identity") sleep(2) # Delay after taking a photo # If no motion is detected, turn off the camera elif motion_detected: print("No motion detected. Finalizing camera...") Vilib.camera_close() motion_detected = False sleep(2) # Delay before re-enabling motion detection sleep(0.1) # Short delay to prevent CPU overuse def destroy(): Vilib.camera_close() print("Camera and face detection stopped.") if __name__ == '__main__': try: main() except KeyboardInterrupt: destroy()
- このコードを実行するには、
sudo python3 security.py
コマンドを使用します。
- このコードを実行するには、
ウェブブラウザを開いて
http://rpi_ip:9000/mjpg
にアクセスし、キャプチャされた映像を視聴できます。さらに、キャプチャされた顔の画像は/home/{username}/Pictures/
で見つけることができます。
コミュニティチュートリアル¶
この文書は、SunFounder Raspberry Pi Robot HATに関する概要を説明し、その目的、互換性、仕様、テストについて述べています:
はじめに: Raspberry PiベースのDIYロボットプロジェクトの制御を簡素化するRobot HATの役割について説明します。
仕様: 電源入力、バッテリーの詳細、ポート、モータードライバーの機能など、技術的な仕様について詳述します。
ポートの概要: 電源、デジタル、アナログ、PWM、I2C、SPI、UART、モーターポートなど、各種ポートについて説明します。
追加コンポーネント: ボタン、LED、スピーカーなどの追加コンポーネントと、Raspberry PiのPIN配置を強調します。
セットアップとテスト: Robot HATの取り付け、必要なコンポーネント、LEDやサーボモーターなどの機能のテスト手順について案内します。
よくある質問¶
Q1: バッテリーを接続しながら、同時にRaspberry Piに電力を供給することは可能ですか?¶
A: はい、Robot HATには逆流防止ダイオードが内蔵されており、Raspberry Piの電力がRobot HATに逆流するのを防ぎます。
Q2: 充電中にRobot HATを使用することは可能ですか?¶
A: はい、充電中でもRobot HATを使用できます。充電中、入力電力は充電チップによって増幅され、バッテリーを充電しながら外部使用のためのDC-DC降圧にも電力を供給します。充電電力は約10Wです。外部電力消費が長期間にわたって高すぎる場合、バッテリーが電力を補うことがあります。これは、使用中の携帯電話が充電されるのと同様です。ただし、同時に充電と使用を行う際には、バッテリーの容量に注意し、完全に消耗させないようにすることが重要です。
Q3: スピーカーから音が出ないのはなぜですか?¶
スクリプトが実行されているにもかかわらずスピーカーから音が出ない場合、いくつかの理由が考えられます:
i2samp.sh
スクリプトがインストールされているか確認してください。詳細な指示については、 スピーカー用の i2samp.sh をインストールする を参照してください。スピーカー関連のスクリプトを実行する際には、管理者権限を得るために
sudo
を追加する必要があります。例えば、sudo python3 tts.py
とします。スピーカー関連のスクリプトを実行する際に、Raspberry Piの組み込みプログラミングツール(例えばGeany)を使用しないでください。これらのツールは標準ユーザー権限で実行されますが、スピーカーの管理などのハードウェア制御にはより高い権限がしばしば必要です。