SunFounder Robot HAT

SunFounder Robot HATをお選びいただき、ありがとうございます。

注釈

このドキュメントは以下の言語で利用可能です。

ご希望の言語でドキュメントにアクセスするために、それぞれのリンクをクリックしてください。

_images/robot_hat_pic.png

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ドライバ、モータードライバが特徴です。

ピン配置

_images/robot_hat_pinout.png
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
ADC Pin
PWM Pin
  • 12チャンネルPWMピン、P0-P11。

  • ピン: PWM

  • API: クラス PWM

Left/Right Motor Port
I2C Pin and I2C Port
  • I2C Pin:P2.54 4ピンインターフェース。

  • I2C Port:SH1.0 4ピンインターフェース、QWIICおよびSTEMMA QTと互換性があります。

  • これらのI2Cインターフェースは、GPIO2 (SDA) および GPIO3 (SCL) を介してRaspberry PiのI2Cインターフェースに接続されています。

  • ピン: I2C

  • API: クラス I2C

SPI Pin
  • P2.54 7ピンSPIインターフェース。

  • ピン: SPI

UART Pin
  • P2.54 4ピンインターフェース。

  • ピン: UART

RST Button
  • Ezblockを使用しているとき、RSTボタンはEzblockプログラムを再起動するためのボタンとして機能します。

  • Ezblockを使用していない場合、RSTボタンにはあらかじめ定義された機能はなく、あなたのニーズに合わせて完全にカスタマイズすることができます。

  • ピン: ボタン

  • API: クラス Pin

USR Button
  • USRボタンの機能はプログラミングによって設定することができます。(押すと入力「0」になり、放すと入力「1」になります。)

  • API: クラス PinPin("SW") を使用して定義することができます。

  • ピン: ボタン

Battery Indicator
Speaker and Speaker Port
  • Speaker:これは2030オーディオチャンバースピーカーです。

  • Speaker Port:Robot HATは、2030オーディオチャンバースピーカーと共に、オンボードI2Sオーディオ出力を備え、モノサウンド出力を提供します。

  • ピン: スピーカーとスピーカーポート

  • API: クラス Music

ピンマッピング

Raspberry Pi IO

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ピンデジタルピンがあります。

_images/digitalio.png
Digital IO

Robot Hat V4

Raspberry Pi

D0

GPIO17

D1

GPIO4

D2

GPIO27

D3

GPIO22

ADC

_images/adcpin.png

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

_images/btradc.png

また、ADCチャネルA4は抵抗を使用した電圧分割器を介してバッテリーに接続されており、バッテリー電圧を測定しておおよそのバッテリー残量を推定するために使用されます。

電圧分割比は20K/10Kなので:

  • A4電圧 (Va4) = value_A4 / 4095.0 * 3.3

  • バッテリー電圧 (Vbat) = Va4*3

  • バッテリー電圧 (Vbat) = value_A4 / 4095.0 * 3.3 * 3

PWM

_images/pwmpin.png

Robot HATには、2.54mm間隔で配置された4セットの3ピンPWMピンがあり、電源は5Vです。PWMの使用方法は、 オンボードMCU で詳しく説明されています。

注釈

PWM13および14チャンネルはモータードライブ用に使用されます。

I2C

_images/i2cpin.png

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

_images/spipin.png

Robot HATのSPIインターフェイスは7ピンのP2.54インターフェイスです。これはRaspberry PiのSPIインターフェイスに接続され、割り込みやリセットなどの目的に使用できる追加のI/Oピンを含んでいます。

SPI

Robot Hat V4

Raspberry Pi

BSY

GPIO6

CS

CE0(GPIO8)

SCK

SCLK(GPIO11)

MI

MISO(GPIO9)

MO

MOSI(GPIO10)

3V3

3.3V 電源

GND

グラウンド

UART

_images/uartpin.png

Robot HATのUARTインターフェイスは4ピンのP2.54インターフェイスです。これはRaspberry PiのGPIO14 (TXD)とGPIO15 (RXD)ピンに接続されます。

ボタン

Robot HATには1つのLEDと2つのボタンがあり、すべてRaspberry PiのGPIOピンに直接接続されています。Ezblockを使用している場合、RSTボタンはEzblockプログラムを再起動するためのボタンとして機能します。Ezblockを使用していない場合、RSTボタンには事前に定義された機能はなく、必要に応じて完全にカスタマイズすることができます。

LED&ボタン

Robot Hat V4

Raspberry Pi

LED

GPIO26

USR

GPIO25

RST

GPIO16

スピーカーとスピーカーポート

Robot HATにはオンボードのI2Sオーディオ出力が搭載されており、2030オーディオチャンバースピーカーと共にモノラルサウンド出力を提供します。

I2S

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に達するかそれを超えると、他のバッテリーがその閾値以下の場合、その特定のバッテリーの充電電流が減少します。

バッテリーについて

バッテリー

_images/3pin_battery.jpg
  • 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 が正しく機能しないことがあります。

_images/3d33.png
  1. システムをアップデートしてください。

    インターネットに接続していることを確認し、システムをアップデートしてください:

    sudo apt update
    sudo apt upgrade
    

    注釈

    OSの Lite バージョンをインストールする場合、Python3関連のパッケージをインストールする必要があります。

    sudo apt install git python3-pip python3-setuptools python3-smbus
    
  2. このコマンドをターミナルに入力して、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 を押してプロセスを続行してください。

    _images/dowload_code.png

スピーカー用の i2samp.sh をインストールする

i2samp.sh は、Raspberry Piや類似のデバイスでI2S(Inter-IC Sound)アンプを設定し、構成するために特別に設計された高度なBashスクリプトです。MITライセンスのもとで、さまざまなハードウェアとオペレーティングシステムとの互換性を保証し、インストールや構成を進める前に徹底的なチェックを行います。

スピーカーを適切に動作させたい場合は、このスクリプトのインストールが絶対に必要です。

手順は以下の通りです:

cd ~/robot-hat
sudo bash i2samp.sh

y と入力し enter を押して、スクリプトの実行を続けます。

_images/install_i2s1.png

y と入力し enter を押して、バックグラウンドで /dev/zero を実行します。

_images/install_i2s2.png

y と入力し enter を押して、Raspberry Piを再起動します。

_images/install_i2s2.png

警告

再起動後に音が出ない場合は、 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.PinMCURST に接続されています。MCUは7ビットアドレスの 0x14 を使用しています。

ADC

レジスタアドレスは3バイトで、0x170000から0x140000までがADCチャンネル0から3です。ADCの精度は12ビットで、値は0から4095までです。robot_hat.ADC で詳細を確認してください。

アドレス

説明

0x170000

ADCチャンネル0

0x160000

ADCチャンネル1

0x150000

ADCチャンネル2

0x140000

ADCチャンネル3

0x130000

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%のパルス幅になります。

アドレス

説明

0x20

PWMチャンネル0 オン値 を設定

0x21

PWMチャンネル1 オン値 を設定

0x22

PWMチャンネル2の オン値 を設定

0x23

PWMチャンネル3の オン値 を設定

0x24

PWMチャンネル4の オン値 を設定

0x25

PWMチャンネル5の オン値 を設定

0x26

PWMチャンネル6の オン値 を設定

0x27

PWMチャンネル7の オン値 を設定

0x28

PWMチャンネル8の オン値 を設定

0x29

PWMチャンネル9の オン値 を設定

0x2A

PWMチャンネル10の オン値 を設定

0x2B

PWMチャンネル11の オン値 を設定

0x2C

モーター2の速度 オン値 を設定

0x2D

モーター1の速度 オン値 を設定

プリスケーラー

0x40から始まるレジスタはPWMプリスケーラーを設定するためのもので、範囲は0〜65535です。全14チャンネルに対してタイマーは4つのみです。 PWMタイマー(重要) を参照してください。

アドレス

説明

0x40

タイマー0の プリスケーラー を設定

0x41

タイマー1の プリスケーラー を設定

0x42

タイマー2の プリスケーラー を設定

0x43

タイマー3の プリスケーラー を設定

周期

0x44から始まるレジスタはPWM周期を設定するためのもので、範囲は0〜65535です。全14チャンネルに対してタイマーは4つのみです。 PWMタイマー(重要) を参照してください。

アドレス

説明

0x44

タイマー0の 周期 を設定

0x45

タイマー1の 周期 を設定

0x46

タイマー2の 周期 を設定

0x47

タイマー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

class robot_hat.ADC(chn, address=None, *args, **kwargs)

ベースクラス: I2C

アナログからデジタルへの変換器

__init__(chn, address=None, *args, **kwargs)

アナログからデジタルへの変換器

パラメータ

chn (int/str) -- チャンネル番号 (0-7/A0-A7)

read()

ADC値を読む

戻り値

ADC値(0-4095)

戻り値の型

int

read_voltage()

ADC値を読み取り電圧に変換する

戻り値

電圧値(0-3.3(V))

戻り値の型

float

クラス 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)

モーターを初期化する

パラメータ
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

class robot_hat.modules.Ultrasonic(trig, echo, timeout=0.02)
__init__(trig, echo, timeout=0.02)

クラス 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") # Yellow

API

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

警告

初期化

# 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

警告

# 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つのモーターが同時に動作します。

_images/servo_motor.jpg

ただし、サーボやモーターの始動電流が高い場合は、それらを個別に起動して、電源電流不足を避けることをお勧めします。電流不足は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は理想的です。

このプロジェクトでは、シンプルなラインフォローイングカーを作りました。

_images/diy_car.jpg

コード

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に表示します。

_images/photoresistor.jpg

手順

  1. このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。

    cd ~/
    wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
    
  2. I2C用に smbus2 をインストールします。

    sudo pip3 install smbus2
    
  3. 以下のコードを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)
    
  4. このコードを実行するには、コマンド sudo python3 photoresistor.ty を使用します。

超音波モジュールからの読み取り

このプロジェクトでは、超音波センサーを使用して距離を測定し、その読み取り値をI2C LCD1602に表示します。

_images/ultrasonic.jpg

手順

  1. このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。

    cd ~/
    wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
    
  2. I2C用に smbus2 をインストールします。

    sudo pip3 install smbus2
    
  3. 以下のコードを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)
    
  4. このコードを実行するには、 sudo python3 ultrasonic.ty コマンドを使用します。

プラントモニター

このプロジェクトでは、光の強度と土壌の水分レベルの両方を検出し、I2C LCD1602に表示します。土壌の水分が不足していると感じたら、ボタンモジュールを押して鉢植えに水をやることができます。

_images/plant_monitor.jpg

手順

  1. このプロジェクトではI2C LCD1602を使用しているため、関連するライブラリをダウンロードして機能させる必要があります。

    cd ~/
    wget https://github.com/sunfounder/raphael-kit/blob/master/python/LCD1602.py
    
  2. I2C用に smbus2 をインストールします。

    sudo pip3 install smbus2
    
  3. 以下のコードを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')
    
  4. このコードを実行するには、 sudo python3 plant_monitor.ty コマンドを使用します。

何かを話す

このセクションでは、テキストを音声に変換して、Robot HATに大声で話させる方法を学びます。

手順

  1. コマンドラインからテキストを取得して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())
    
  2. Robot HATに特定の文章を発声させるには、次のコマンドを使用します: sudo python3 tts.py "任意のテキスト" - 単に "任意のテキスト" を希望のフレーズに置き換えてください。

セキュリティシステム

このプロジェクトでは、シンプルなセキュリティシステムを作成しました。PIRセンサーが人の動きを検出すると、カメラが起動します。顔が検出されると、写真を撮り、同時に警告メッセージを発信します。

_images/camera.jpg

手順

  1. 顔検出のための vilib ライブラリをインストールします。

    cd ~/
    git clone -b picamera2 https://github.com/sunfounder/vilib.git
    cd vilib
    sudo python3 install.py
    
  2. 以下のコードを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()
    
  3. このコードを実行するには、 sudo python3 security.py コマンドを使用します。
  4. ウェブブラウザを開いて http://rpi_ip:9000/mjpg にアクセスし、キャプチャされた映像を視聴できます。さらに、キャプチャされた顔の画像は /home/{username}/Pictures/ で見つけることができます。

    _images/browser_camera.jpg

コミュニティチュートリアル

この文書は、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: スピーカーから音が出ないのはなぜですか?

スクリプトが実行されているにもかかわらずスピーカーから音が出ない場合、いくつかの理由が考えられます:

  1. i2samp.sh スクリプトがインストールされているか確認してください。詳細な指示については、 スピーカー用の i2samp.sh をインストールする を参照してください。

  2. スピーカー関連のスクリプトを実行する際には、管理者権限を得るために sudo を追加する必要があります。例えば、 sudo python3 tts.py とします。

  3. スピーカー関連のスクリプトを実行する際に、Raspberry Piの組み込みプログラミングツール(例えばGeany)を使用しないでください。これらのツールは標準ユーザー権限で実行されますが、スピーカーの管理などのハードウェア制御にはより高い権限がしばしば必要です。