SunFounder Raspberry Pi ロボット - PiDog¶

私たちのPiDogを選んでいただき、ありがとうございます。
注釈
この文書は以下の言語で利用可能です。
希望する言語で文書にアクセスするには、それぞれのリンクをクリックしてください。
PiDogは、アルミニウム合金構造のRaspberry Piペットロボットです。機械式ペットとして活動し、かわいらしさを見せ、あなたと交流することができます。
カメラモジュールを搭載しており、色認識、顔検出などのプロジェクトを実行することができます; 12個の金属ギアサーボにより、歩行、立ち、座り、頭を振る、さまざまなポーズを取ることができます; 頭部に搭載された超音波モジュールは、前方の障害物を迅速に検出することが可能です; 特別なタッチセンサーにより、あなたのタッチに反応します; 胸部のライトボードはカラフルな光効果を発し、ロボットHATに搭載されたスピーカーを使用して、PiDogは喜びや興奮などの感情を表現できます。 さらに、PiDogには音の方向センサーと6軸IMUモジュールが装備されており、より複雑で面白い使用シナリオを実現できます。
ご質問がある場合は、service@sunfounder.comまでメールを送ってください。できるだけ早く対応いたします。
内容
組み立て動画¶
PiDogを組み立てる前に、すべての部品とコンポーネントが含まれていることを確認してください。欠品や破損したコンポーネントがある場合は、できるだけ早く問題を解決するために、すぐにSunFounderのservice@sunfounder.comに連絡してください。
組み立て指示については、以下のPDFの手順に従ってください:
Raspberry Pi Zero WをPiDogに取り付ける
メインボードがRaspberry Pi Zero Wの場合、以下の手順でPiDogに取り付けてください。
その後、 2:28 からの動画の指示に従って、組み立てを続けてください。
組み立てチュートリアル動画(Raspberry Pi 4/3/1モデル用)
この動画では、ロボットを一から組み立てるプロセスを案内します。
このチュートリアルでは、以下の内容を学びます:
準備:必要なツールと部品を紹介し、組み立てを開始する前に完全に準備が整っていることを確認します。
組み立て手順:各組み立てステップを体系的にデモンストレーションします。
ヒントと注意点:プロセス全体を通して、一般的な間違いを避け、ロボットがスムーズに動作するようにするための重要なヒントとコツを共有します。
サーボをゼロに設定する:各サーボを固定する前に、最初にゼロに設定する必要があります。ゼロに設定する手順は、最初にRaspberry Pi OSをインストールし、必要なモジュールをインストールし、スクリプトを実行することです(すべてのPWMピンの角度を0に設定します)。その後、サーボワイヤーを接続してサーボをゼロに設定します。
Pidogの組み立てプロセスはかなり長いので、2つの動画に分けています。最初の動画では、Pidogの本体と4本の脚の組み立てをカバーしています。
2つ目の動画では、頭部の組み立てとキャリブレーションをカバーしています。
Pythonで遊ぶ¶
Pythonでプログラミングしたい場合は、基本的なPythonプログラミングスキルとRaspberry Piの基本的な知識が必要になります。まず 1. Pythonについてのクイックガイド に従ってRaspberry Piを設定してください。
1. Pythonについてのクイックガイド¶
このセクションでは、Raspberry Pi OSのインストール方法、Raspberry Piへのwifiの設定方法、Raspberry Piへのリモートアクセス方法、対応するコードの実行方法について学びます。
Raspberry Piに慣れており、コマンドラインを開くことができる場合は、最初の3部分をスキップして最後の部分を完了することができます。
1. 必要なものは何ですか?¶
必要なコンポーネント¶
Raspberry Pi
Raspberry Piは、低コストでクレジットカードサイズのコンピュータで、コンピュータモニターやテレビに接続し、標準のキーボードとマウスを使用します。この小さなデバイスを使えば、あらゆる年齢の人々がコンピューティングを探求し、ScratchやPythonなどの言語でプログラミングを学ぶことができます。

電源アダプター
電源ソケットに接続するために、Raspberry PiにはマイクロUSBポート(多くの携帯電話に見られるものと同じ)があります。少なくとも2.5アンペアを提供する電源が必要です。
マイクロSDカード
Raspberry Piは、すべてのファイルとRaspberry Pi OSを保存するために、マイクロSDカードが必要です。少なくとも8GBの容量があるマイクロSDカードが必要です。
オプションのコンポーネント¶
スクリーン
Raspberry Piのデスクトップ環境を見るためには、テレビ画面またはコンピュータモニターを使う必要があります。スクリーンにスピーカーが内蔵されている場合、Piはそれらを通して音を再生します。
マウス&キーボード
スクリーンを使用する場合、USBキーボードとUSBマウスも必要です。
HDMI
Raspberry Piには、ほとんどの現代のテレビやコンピュータモニターのHDMIポートと互換性のあるHDMI出力ポートがあります。画面にDVIポートやVGAポートしかない場合は、適切な変換ケーブルが必要になります。
ケース
Raspberry Piをケースに入れることができます。これにより、デバイスを保護することができます。
サウンドまたはイヤホン
Raspberry Piには約3.5mmのオーディオポートが装備されており、スクリーンに内蔵スピーカーがない場合やスクリーンを操作しない場合に使用できます。
2. OSのインストール¶
必要なコンポーネント
Raspberry Pi 5B
パーソナルコンピュータ
マイクロSDカード
インストール手順
Raspberry Pi Imager のRaspberry Piソフトウェアダウンロードページを訪れてください。お使いのオペレーティングシステムに対応するImagerバージョンを選択します。ファイルをダウンロードして開き、インストールを開始します。
インストール中に、オペレーティングシステムによってはセキュリティプロンプトが表示される場合があります。例えば、Windowsでは警告メッセージが表示されることがあります。その場合は、 詳細情報 を選択してから とにかく実行 を選択します。画面上の指示に従って、Raspberry Pi Imagerのインストールを完了します。
SDカードをコンピュータまたはラップトップのSDカードスロットに挿入します。
Raspberry Pi Imagerアプリケーションをクリックするか、ターミナルで
rpi-imager
と入力して起動します。CHOOSE DEVICE をクリックして、リストから特定のRaspberry Piモデルを選択します(注:Raspberry Pi 5は適用されません)。
CHOOSE OS を選択し、 Raspberry Pi OS (Legacy) を選びます。
警告
スピーカーが動作しないため、 Bookworm バージョンはインストールしないでください。
Debian Bullseye バージョンの Raspberry Pi OS (Legacy) をインストールする必要があります。
Choose Storage をクリックして、インストールに適したストレージデバイスを選択します。
注釈
正しいストレージデバイスを選択してください。混乱を避けるために、複数のストレージデバイスが接続されている場合は、追加のデバイスを切断してください。
NEXT をクリックし、 EDIT SETTINGS をクリックしてOSの設定をカスタマイズします。Raspberry Pi用のモニターがある場合は、次のステップをスキップして「Yes」をクリックしてインストールを開始します。他の設定は後でモニター上で調整します。
Raspberry Piの ホスト名 を定義します。
注釈
ホスト名はRaspberry Piのネットワーク識別子です。
<hostname>.local
または<hostname>.lan
を使用してPiにアクセスできます。Raspberry Piの管理者アカウント用に ユーザー名 と パスワード を作成します。
注釈
デフォルトパスワードがないため、独自のユーザー名とパスワードを設定することがRaspberry Piのセキュリティにとって重要です。
ワイヤレスLANを設定し、ネットワークの SSID と パスワード を入力します。
注釈
Wireless LAN country
を、お住まいの場所に対応する2文字の ISO/IEC alpha2コード に設定してください。SERVICES をクリックし、安全なパスワードベースのリモートアクセスのために SSH を有効にします。設定を保存することを忘れないでください。
Yes をクリックして選択した設定を確認します。
SDカードに既存のデータがある場合は、データ損失を防ぐためにバックアップしてください。バックアップが不要な場合は、「Yes」をクリックして進行します。
OSのインストールプロセスがSDカード上で開始されます。完了時に確認ダイアログが表示されます。
Raspberry Pi OSがセットアップされたSDカードを、Raspberry Piの裏側にあるmicroSDカードスロットに挿入します。
3. Raspberry Piへの電源供給(重要)¶
充電¶
バッテリーケーブルを挿入してください。次に、バッテリーを充電するためにUSB-Cケーブルを挿入します。 充電器はご自身で用意する必要があります。5V 3Aの充電器をお勧めしますが、お使いのスマートフォンの充電器でも問題ありません。

注釈
ロボットハットのType-Cポートに外部のType-C電源を接続すると、すぐにバッテリーの充電が開始され、赤いインジケーターライトが点灯します。バッテリーが完全に充電されると、赤いライトは自動的に消灯します。
電源ON¶
電源スイッチをオンにしてください。電源インジケーターライトとバッテリーレベルインジケーターライトが点灯します。

数秒待ってから、軽いビープ音が聞こえるはずです。これはラズベリーパイが正常に起動したことを示しています。
注釈
バッテリーレベルインジケーターライトが両方ともオフの場合は、バッテリーを充電してください。 長時間のプログラミングやデバッグが必要な場合は、USB-Cケーブルを挿入してバッテリーを同時に充電し、ラズベリーパイを稼働させることができます。
18650 バッテリー¶

VCC: バッテリーの正極端子です。ここにはVCCとGNDの2つのセットがあり、電流を増やし、抵抗を減らすためです。
Middle: 2つのセル間の電圧を均等にし、バッテリーを保護します。
GND: バッテリーの負極端子です。
これはSunFounderが製作した2つの18650バッテリーから成るカスタムバッテリーパックで、容量は2000mAhです。コネクタはXH2.54 3Pで、シールドに挿入した後、直接充電できます。
特徴
バッテリー充電:5V/2A
バッテリー出力:5V/5A
バッテリー容量:3.7V 2000mAh x 2
バッテリー寿命:90分
バッテリー充電時間:130分
コネクタ:XH2.54 3P
4. Raspberry Piの設定¶
画面を使った設定¶
画面を使うことで、Raspberry Piの作業が簡単になります。
必要なコンポーネント
Raspberry Pi 5 Model B
電源アダプター
マイクロSDカード
画面用電源アダプター
HDMIケーブル
画面
マウス
キーボード
手順:
マウスとキーボードをRaspberry Piに接続します。
HDMIケーブルを使用して、画面をRaspberry PiのHDMIポートに接続します。画面が電源に接続され、オンになっていることを確認します。
電源アダプターを使用してRaspberry Piに電源を供給します。数秒後にRaspberry Pi OSのデスクトップが画面に表示されるはずです。
画面がない場合の設定¶
モニターがない場合は、リモートログインが適切なオプションです。
必要なコンポーネント
Raspberry Pi 5 Model B
電源アダプター
マイクロSDカード
SSHを使用して、Raspberry PiのBashシェル(デフォルトのLinuxシェル)にアクセスできます。Bashは、さまざまなタスクを実行するためのコマンドラインインターフェースを提供します。
グラフィカルユーザーインターフェース(GUI)を好む方には、リモートデスクトップ機能がファイル管理や操作を行うための便利な代替手段です。
お使いのオペレーティングシステムに基づいた詳細な設定チュートリアルについては、以下のセクションを参照してください:
Mac OS Xユーザー向け¶
Mac OS Xユーザーにとって、SSH(Secure Shell)はRaspberry Piへのリモートアクセスと制御を安全かつ便利に行う方法を提供します。これは、Raspberry Piをリモートで作業する場合や、モニターに接続されていない場合に特に便利です。Macのターミナルアプリケーションを使用すると、この安全な接続を確立できます。このプロセスには、Raspberry Piのユーザー名とホスト名を含むSSHコマンドが含まれます。初回接続時には、Raspberry Piの認証性を確認するセキュリティプロンプトが表示されます。
Raspberry Piに接続するには、次のSSHコマンドを入力します:
ssh pi@raspberrypi.local
初めてログインする際にセキュリティメッセージが表示されます。 yes と応答して進行します。
The authenticity of host 'raspberrypi.local (2400:2410:2101:5800:635b:f0b6:2662:8cba)' can't be established. ED25519 key fingerprint is SHA256:oo7x3ZSgAo032wD1tE8eW0fFM/kmewIvRwkBys6XRwg. Are you sure you want to continue connecting (yes/no/[fingerprint])?
Raspberry Piのパスワードを入力します。入力しているパスワードが画面に表示されないことに注意してください。これは標準的なセキュリティ機能です。
pi@raspberrypi.local's password: Linux raspberrypi 5.15.61-v8+ #1579 SMP PREEMPT Fri Aug 26 11:16:44 BST 2022 aarch64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Sep 22 12:18:22 2022 pi@raspberrypi:~ $
Windowsユーザー向け¶
Windows 10以降のユーザーは、以下の手順によりRaspberry Piへのリモートログインが可能です:
Windowsの検索ボックスで
powershell
と入力します。Windows PowerShell
を右クリックし、管理者として実行
を選択します。PowerShellで
ping -4 <hostname>.local
と入力して、Raspberry PiのIPアドレスを確認します。IPアドレスが確認できたら、
ssh <username>@<hostname>.local
またはssh <username>@<IP address>
を使ってRaspberry Piにログインします。ssh pi@raspberrypi.local
警告
エラーメッセージ
The term 'ssh' is not recognized as the name of a cmdlet...
が表示された場合、システムにSSHツールが事前にインストールされていない可能性があります。この場合、Powershellを使用してOpenSSHをインストール に従ってOpenSSHを手動でインストールするか、 PuTTY に記載されているサードパーティツールを使用する必要があります。初めてログインする際にセキュリティメッセージが表示されます。
yes
と入力して進行します。The authenticity of host 'raspberrypi.local (2400:2410:2101:5800:635b:f0b6:2662:8cba)' can't be established. ED25519 key fingerprint is SHA256:oo7x3ZSgAo032wD1tE8eW0fFM/kmewIvRwkBys6XRwg. Are you sure you want to continue connecting (yes/no/[fingerprint])?
以前に設定したパスワードを入力します。セキュリティ上の理由から、パスワードの文字は画面に表示されません。
注釈
パスワードを入力する際に文字が表示されないのは正常です。正しいパスワードを入力してください。
接続が完了すると、Raspberry Piはリモート操作の準備が整います。
Linux/Unixユーザー向け¶
Linux/Unixシステムで**ターミナル**を探して開きます。
Raspberry Piが同じネットワークに接続されていることを確認します。
ping <hostname>.local
と入力して確認してください。例えば:ping raspberrypi.local
Raspberry Piがネットワークに接続されている場合は、IPアドレスが表示されます。
ターミナルに
Ping request could not find host pi.local. Please check the name and try again.
のようなメッセージが表示された場合は、入力したホスト名を再確認してください。IPアドレスが取得できない場合は、Raspberry PiのネットワークまたはWiFi設定を調べてください。
ssh <username>@<hostname>.local
またはssh <username>@<IP address>
と入力してSSH接続を開始します。例えば:ssh pi@raspberrypi.local
初めてログインする際、セキュリティメッセージが表示されます。「yes」と入力して進行します。
The authenticity of host 'raspberrypi.local (2400:2410:2101:5800:635b:f0b6:2662:8cba)' can't be established. ED25519 key fingerprint is SHA256:oo7x3ZSgAo032wD1tE8eW0fFM/kmewIvRwkBys6XRwg. Are you sure you want to continue connecting (yes/no/[fingerprint])?
以前に設定したパスワードを入力します。セキュリティ上の理由から、入力中にパスワードが表示されないことに注意してください。
注釈
パスワードの文字がターミナルに表示されないのは正常です。正しいパスワードを入力するようにしてください。
正常にログインできたら、Raspberry Piは接続され、次のステップに進む準備が整いました。
Raspberry Piのリモートデスクトップアクセス¶
コマンドラインアクセスよりもグラフィカルユーザーインターフェース(GUI)を好む方のために、Raspberry Piはリモートデスクトップ機能をサポートしています。このガイドでは、リモートアクセス用のVNC(Virtual Network Computing)の設定と使用方法を説明します。
この目的のために VNC® Viewer の使用を推奨します。
Raspberry PiでVNCサービスを有効にする
VNCサービスはRaspberry Pi OSにプリインストールされていますが、デフォルトでは無効になっています。次の手順に従って有効にしてください:
Raspberry Piのターミナルで次のコマンドを入力します:
sudo raspi-config
下矢印キーを使用して Interfacing Options に移動し、 Enter キーを押します。
オプションから VNC を選択します。
矢印キーを使用して <Yes> -> <OK> -> <Finish> を選択し、VNCサービスの有効化を完了します。
VNC Viewerを使用してログインする
個人用コンピューターに VNC Viewer をダウンロードしてインストールします。
インストール後、VNC Viewerを起動します。Raspberry Piのホスト名またはIPアドレスを入力し、Enterキーを押します。
プロンプトが表示されたら、Raspberry Piのユーザー名とパスワードを入力し、 OK をクリックします。
これで、Raspberry Piのデスクトップインターフェースにアクセスできます。
5. すべてのモジュールをインストールする(重要)¶
システムを更新します。
インターネットに接続していることを確認し、システムを更新してください:
sudo apt update sudo apt upgrade
注釈
LiteバージョンのOSをインストールする場合は、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
vilib
モジュールをインストールします。cd ~/ git clone -b picamera2 https://github.com/sunfounder/vilib.git cd vilib sudo python3 install.py
コードをダウンロードします。
cd ~/ git clone https://github.com/sunfounder/pidog.git
pidog
モジュールをインストールします。cd pidog sudo python3 setup.py install
このステップには少し時間がかかるので、気長にお待ちください。
スクリプト
i2samp.sh
を実行します。最後に、i2sアンプに必要なコンポーネントをインストールするためのスクリプト
i2samp.sh
を実行する必要があります。そうしないと、ロボットに音が出ません。cd ~/pidog sudo bash i2samp.sh
y
と入力し、Enter
を押してスクリプトの実行を続行します。y
と入力し、Enter
を押して/dev/zero
をバックグラウンドで実行します。y
と入力し、Enter
を押してマシンを再起動します。注釈
再起動後に音が出ない場合は、
i2samp.sh
スクリプトを複数回実行する必要があるかもしれません。
6. I2CおよびSPIインターフェースの確認¶
Raspberry PiのI2CおよびSPIインターフェースを使用します。これらのインターフェースは、以前に robot-hat
モジュールをインストールする際に有効にされているはずです。すべてが順調であることを確認するために、実際に有効になっているかどうかを確認しましょう。
次のコマンドを入力します:
sudo raspi-config
キーボードの下矢印キーで Interfacing Options を選択し、 Enter キーを押します。
次に I2C を選択します。
キーボードの矢印キーを使用して、 <Yes> -> <OK> を選択し、I2Cの設定を完了します。
再度 Interfacing Options に行き、 SPI を選択します。
キーボードの矢印キーを使用して、 <Yes> -> <OK> を選択し、SPIの設定を完了します。
7. サーボの調整(重要)¶
サーボの角度範囲は-90〜90度ですが、工場で設定された角度はランダムで、0°かもしれないし、45°かもしれません。このような角度で直接組み立てると、ロボットがコードを実行した後に混乱状態になったり、最悪の場合、サーボがブロックして焼き切れる原因になります。
したがって、ここではすべてのサーボの角度を0°に設定してから取り付ける必要があります。これにより、サーボの角度が中央にあり、どの方向に回転しても問題ありません。
サーボが正しく0°に設定されていることを確認するために、まずサーボアームをサーボ軸に挿入し、ロッカーアームを優しく異なる角度に回転させます。このサーボアームは、サーボが回転していることを明確に確認するためのものです。
それでは、
examples/
フォルダ内のservo_zeroing.py
を実行します。cd ~/pidog/examples sudo python3 servo_zeroing.py
注釈
エラーが発生した場合は、Raspberry PiのI2Cポートを再度有効にしてみてください。詳細は 6. I2CおよびSPIインターフェースの確認 を参照。
次に、以下のようにサーボケーブルをP11ポートに接続します。同時に、サーボアームが位置に回転するのが見えます(これが0°の位置で、ランダムな位置であり、垂直または平行でない場合があります)。
今度はサーボアームを取り外し、サーボワイヤーが接続されたままにし、電源を切らないでください。その後、紙の指示に従って組み立てを続けます。
注釈
サーボスクリューで固定する前に、このサーボケーブルを抜かないでください。固定した後に抜くことができます。
電源が入っている状態でサーボを回転させないでください。これにより損傷を防ぐことができます。サーボ軸が正しい角度で挿入されていない場合は、サーボを取り出して再挿入してください。
各サーボを組み立てる前に、PWMピンにサーボケーブルを接続し、電源を入れて0°に設定する必要があります。
ビデオ
私たちの組み立てビデオの 3:40から7:23 まで、この章の詳細なチュートリアルがあります。直接ビデオの指示に従うことができます。
組み立てが完了したら、組み立てにわずかなずれがある場合にサーボが損傷するのを防ぐために、PiDogをキャリブレーションする必要があります。
2. PiDogのキャリブレーション¶
イントロダクション
PiDogをキャリブレーションすることは、安定して効率的に動作させるために不可欠なステップです。このプロセスは、組み立て中や構造上の問題から生じる可能性のある不均衡や不正確さを修正するのに役立ちます。PiDogがしっかりと歩き、期待通りに動作するように、これらの手順に注意深く従ってください。
しかし、偏差角が大きすぎる場合は、 7. サーボの調整(重要) に戻ってサーボの角度を0°に設定し、その後の指示に従ってPiDogを再組み立てる必要があります。
キャリブレーションビデオ
包括的なガイドについては、完全なキャリブレーションビデオを参照してください。これには、PiDogを正確にキャリブレーションするための視覚的なステップバイステッププロセスが含まれています。
手順
具体的な手順は以下の通りです:
PiDogをベースに置きます。
PiDogのexamplesディレクトリに移動し、
0_calibration.py
スクリプトを実行します。cd ~/pidog/examples sudo python3 0_calibration.py
スクリプトを実行すると、ターミナルにユーザーインターフェースが表示されます。
提供された画像に示されているように、 キャリブレーションルーラー (アクリルC)を配置します。ターミナルで
1
を押し、続いてw
とs
キーを使って画像に示されているように端を揃えます。次の画像に示されたように、 キャリブレーションルーラー (アクリルC)を再配置します。ターミナルで
2
を押し、続いてw
とs
を使って端を揃えます。
残りのサーボ(3〜8)に対してキャリブレーションプロセスを繰り返します。PiDogの4本の脚すべてがキャリブレーションされていることを確認してください。
また、PiDogで以下のプロジェクト効果を実現することもできます。
3. 楽しいPythonプロジェクト¶
ここでは、PiDogの多様性と能力を示すエキサイティングなプロジェクトのコレクションに深く潜り込みます。 1. 起床 の起床ルーチンの基本設定から、 13. ボール追跡 のボール追跡の高度なダイナミクスまで、各プロジェクトはロボット工学のPythonプログラミングの世界へのユニークな洞察を提供します。PiDogにエリアをパトロールさせたり、コマンドに反応させたり、腕立て伏せを実行させたり、命令で遠吠えさせたりすることに興味がある場合、あなた向けのプロジェクトがあります。さらに、PiDogの能力をコンピュータインターフェースに拡張したい人向けに、キーボードやアプリ制御のチュートリアルもあります。飛び込んで、これらの実践的なPythonプロジェクトでPiDogと共に発見と楽しみの旅を始めましょう!
1. 起床¶
これはPiDogの最初のプロジェクトです。PiDogを深い眠りから目覚めさせます。

コードの実行
cd ~/pidog/examples
sudo python3 1_wake_up.py
コードを実行した後、PiDogは以下の動作を順番に行います:
伸びをする、ねじれる、座る、尻尾を振る、ハアハアする。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from preset_actions import pant
from preset_actions import body_twisting
my_dog = Pidog(head_init_angles=[0, 0, -30])
sleep(1)
def wake_up():
# stretch
my_dog.rgb_strip.set_mode('listen', color='yellow', bps=0.6, brightness=0.8)
my_dog.do_action('stretch', speed=50)
my_dog.head_move([[0, 0, 30]]*2, immediately=True)
my_dog.wait_all_done()
sleep(0.2)
body_twisting(my_dog)
my_dog.wait_all_done()
sleep(0.5)
my_dog.head_move([[0, 0, -30]], immediately=True, speed=90)
# sit and wag_tail
my_dog.do_action('sit', speed=25)
my_dog.wait_legs_done()
my_dog.do_action('wag_tail', step_count=10, speed=100)
my_dog.rgb_strip.set_mode('breath', color=[245, 10, 10], bps=2.5, brightness=0.8)
pant(my_dog, pitch_comp=-30, volume=80)
my_dog.wait_all_done()
# hold
my_dog.do_action('wag_tail', step_count=10, speed=30)
my_dog.rgb_strip.set_mode('breath', 'pink', bps=0.5)
while True:
sleep(1)
if __name__ == "__main__":
try:
wake_up()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
2. 機能デモンストレーション¶
このプロジェクトでは、PiDogの一般的な動作と音をすべて紹介します。
シリアル番号を入力することで、PiDogに動作や音を出させることができます。
現在この例に含まれている動作/音響効果は以下の通りです。

Actions: |
Sound Effect: |
---|---|
1.stand |
16.angry |
2.sit |
17.confused_1 |
3.lie |
18.confused_2 |
4.lie_with_hands_out |
19.confused_3 |
5.trot |
20.growl_1 |
6.forward |
21.growl_2 |
7.backward |
22.howling |
8.turn_left |
23.pant |
9.turn_right |
24.single_bark_1 |
10.doze_off |
25.single_bark_2 |
11.stretch |
26.snoring |
12.pushup |
27.woohoo |
13.shake_head |
|
14.tilting_head |
|
15.wag_tail |
コードの実行
cd ~/pidog/examples
sudo python3 2_function_demonstration.py
この例を実行した後、 1
と入力して ENTER
キーを押すと、PiDogが立ち上がります; 2
と入力すると、PiDogが座ります; 27
と入力すると、PiDogが woohoo~
と音を発します。
プログラムを終了するには Ctrl+C
を押します。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from time import sleep
from pidog import Pidog
import os
import curses
import curses_utils
# init pidog
# ======================================
my_dog = Pidog()
sleep(0.5)
# global variables
# ======================================
actions = [
# name, head_pitch_adjust(-1, use last_pitch), speed
['stand', 0, 50],
['sit', -30, 50],
['lie', 0, 20],
['lie_with_hands_out', 0, 20],
['trot', 0, 95],
['forward', 0, 98],
['backward', 0, 98],
['turn_left', 0, 98],
['turn_right', 0, 98],
['doze_off', -30, 90],
['stretch', 20, 20],
['push_up', -30, 50],
['shake_head', -1, 90],
['tilting_head', -1, 60],
['wag_tail', -1, 100],
]
actions_len = len(actions)
sound_effects = []
# change working directory
abspath = os.path.abspath(os.path.dirname(__file__))
# print(abspath)
os.chdir(abspath)
for name in os.listdir('../sounds'):
sound_effects.append(name.split('.')[0])
sound_effects.sort()
sound_len = len(sound_effects)
# limit sound quantity
if sound_len > actions_len:
sound_len = actions_len
sound_effects = sound_effects[:actions_len]
last_index = 0
last_display_index = 0
exit_flag = False
last_head_pitch = 0
STANDUP_ACTIONS = ['trot', 'forward', 'backward', 'turn_left', 'turn_right']
# define pad size
# ======================================
curses_utils.PAD_Y = 22
curses_utils.PAD_X = 70
# display fuctions
# ======================================
def display_head(subpad):
title = "Function Demonstration"
tip1 = "Input Function number to see how it goes."
tip2 = "Actions will repeat 10 times."
type_name_1 = "Actions:"
type_name_2 = "Sound Effect:"
tip3 = "(need to run with sudo)"
curses_utils.clear_line(subpad, 0, color=curses_utils.BLACK_BLUE)
subpad.addstr(0, 2, title, curses_utils.BLACK_BLUE | curses.A_BOLD)
subpad.addstr(1, 2, tip1, curses_utils.GRAY)
subpad.addstr(2, 2, tip2, curses_utils.GRAY)
curses_utils.clear_line(subpad, 3, color=curses_utils.WHITE_GRAY)
subpad.addstr(3, 2, type_name_1, curses_utils.WHITE_GRAY)
subpad.addstr(3, 30, type_name_2, curses_utils.WHITE_GRAY)
subpad.addstr(3, 31+len(type_name_2), tip3, curses_utils.YELLOW_GRAY)
def display_selection(subpad, index):
global last_display_index
# reset last selection
if last_display_index > actions_len + sound_len-1 or last_display_index < 0:
last_display_index = 0
if last_display_index != index:
if last_display_index < actions_len:
subpad.addstr(last_display_index, 2, f"{last_display_index+1}. {actions[last_display_index][0]}", curses_utils.LIGHT_GRAY)
else:
sound_index = last_display_index-actions_len
subpad.addstr(sound_index, 30, f"{last_display_index+1}. {sound_effects[sound_index]}", curses_utils.LIGHT_GRAY)
last_display_index = index
# highlight currernt selection
if index > actions_len + sound_len-1 or index < 0:
pass
elif index < actions_len:
subpad.addstr(index, 2, f"{index+1}. {actions[index][0]}", curses_utils.WHITE_BLUE)
else:
sound_index = index-actions_len
subpad.addstr(sound_index, 30, f"{index+1}. {sound_effects[sound_index]}", curses_utils.WHITE_BLUE)
def display_actions(subpad):
for i in range(actions_len):
subpad.addstr(i, 2, f"{i+1}. {actions[i][0]}", curses_utils.LIGHT_GRAY)
for i in range(sound_len):
subpad.addstr(i, 30, f"{i+actions_len+1}. {sound_effects[i]}", curses_utils.LIGHT_GRAY)
def display_bottom(subpad):
curses_utils.clear_line(subpad, 0, color=curses_utils.WHITE_GRAY)
subpad.addstr(0, 0, "Enter function number: ", curses_utils.WHITE_GRAY)
subpad.addstr(0, curses_utils.PAD_X-16, "Ctrl^C to quit", curses_utils.WHITE_GRAY)
def do_function(index):
global last_index, last_head_pitch
my_dog.body_stop()
if index < 0:
return
if index < actions_len:
name, head_pitch_adjust, speed = actions[index]
# If last action is push_up, then lie down first
if last_index < len(actions) and actions[last_index][0] in ('push_up'):
last_head_pitch = 0
my_dog.do_action('lie', speed=60)
# If this action is trot, forward, turn left, turn right and backward, and, last action is not, then stand up
if name in STANDUP_ACTIONS and last_index < len(actions) and actions[last_index][0] not in STANDUP_ACTIONS:
last_head_pitch = 0
my_dog.do_action('stand', speed=60)
if head_pitch_adjust != -1:
last_head_pitch = head_pitch_adjust
my_dog.head_move_raw([[0, 0, last_head_pitch]], immediately=False, speed=60)
my_dog.do_action(name, step_count=10, speed=speed, pitch_comp=last_head_pitch)
last_index = index
elif index < actions_len + sound_len:
my_dog.speak(sound_effects[index - len(actions)], volume=80)
last_index = index
def main(stdscr):
# reset screen
stdscr.clear()
stdscr.move(4, 0)
stdscr.refresh()
# disable cursor
curses.curs_set(0)
# init color
curses.start_color()
curses.use_default_colors()
curses_utils.init_preset_colors()
curses_utils.init_preset__color_pairs()
# init pad
pad = curses.newpad(curses_utils.PAD_Y, curses_utils.PAD_X)
# init subpad
head_pad = pad.subpad(4, curses_utils.PAD_X, 0, 0)
selection_pad = pad.subpad(actions_len, curses_utils.PAD_X, 4, 0)
bottom_pad = pad.subpad(1, curses_utils.PAD_X, actions_len+4, 0)
# add content to a
display_head(head_pad)
display_actions(selection_pad)
display_head(head_pad)
curses_utils.pad_refresh(pad)
curses_utils.pad_refresh(selection_pad)
# for i in range(2):
# for i in range(30):
# display_selection(selection_pad, i)
# curses_utils.pad_refresh(selection_pad)
# sleep(0.1)
# enable cursor and echo
curses.curs_set(0)
curses.echo()
while True:
# draw bottom bar
display_bottom(bottom_pad)
curses_utils.pad_refresh(bottom_pad)
# reset cursor
stdscr.move(actions_len+4, 23)
stdscr.refresh()
# red key
key = stdscr.getstr()
try:
index = int(key) - 1
except ValueError:
index = -1
# display selection
display_selection(selection_pad, index)
curses_utils.pad_refresh(selection_pad)
# do fuction
do_function(index)
sleep(0.2)
if __name__ == "__main__":
try:
curses.wrapper(main)
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
3. パトロール¶
このプロジェクトでは、PiDogが生き生きとした行動をとります:パトロール。
PiDogは前方に進みますが、前方に障害物がある場合は停止して吠えます。

コードの実行
cd ~/pidog/examples
sudo python3 3_patrol.py
この例を実行すると、PiDogは尻尾を振り、左右をスキャンし、前方に歩きます。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
import time
from pidog import Pidog
from preset_actions import bark
t = time.time()
my_dog = Pidog()
my_dog.do_action('stand', speed=80)
my_dog.wait_all_done()
time.sleep(.5)
DANGER_DISTANCE = 15
stand = my_dog.legs_angle_calculation([[0, 80], [0, 80], [30, 75], [30, 75]])
def patrol():
distance = round(my_dog.ultrasonic.read_distance(), 2)
print(f"distance: {distance} cm", end="", flush=True)
# danger
if distance < DANGER_DISTANCE:
print("\033[0;31m DANGER !\033[m")
my_dog.body_stop()
head_yaw = my_dog.head_current_angles[0]
# my_dog.rgb_strip.set_mode('boom', 'red', bps=2)
my_dog.rgb_strip.set_mode('bark', 'red', bps=2)
my_dog.tail_move([[0]], speed=80)
my_dog.legs_move([stand], speed=70)
my_dog.wait_all_done()
time.sleep(0.5)
bark(my_dog, [head_yaw, 0, 0])
while distance < DANGER_DISTANCE:
distance = round(my_dog.ultrasonic.read_distance(), 2)
if distance < DANGER_DISTANCE:
print(f"distance: {distance} cm \033[0;31m DANGER !\033[m")
else:
print(f"distance: {distance} cm", end="", flush=True)
time.sleep(0.01)
# safe
else:
print("")
my_dog.rgb_strip.set_mode('breath', 'white', bps=0.5)
my_dog.do_action('forward', step_count=2, speed=98)
my_dog.do_action('shake_head', step_count=1, speed=80)
my_dog.do_action('wag_tail', step_count=5, speed=99)
if __name__ == "__main__":
try:
while True:
patrol()
time.sleep(0.01)
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
4. 反応¶
このプロジェクトでは、PiDogが興味深い方法であなたと相互作用します。
前から手を伸ばしてPiDogの頭をつかむと、警戒して吠えます。

しかし、後ろから手を伸ばして頭をなでると、とても楽しむでしょう。
コードの実行
cd ~/pidog/examples
sudo python3 4_response.py
この例を実行すると、PiDogの超音波モジュールが前方に障害物があるかどうかを検出します。 手を検出すると、呼吸ライトが赤く光り、後退して吠えます。
同時に、タッチセンサーも作動します。タッチセンサーが撫でられた場合(単に触れられただけでなく)、 PiDogは頭を振り、尻尾を振り、快適な表情を見せます。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from math import sin
from preset_actions import bark_action
my_dog = Pidog()
sleep(0.1)
def lean_forward():
my_dog.speak('angry', volume=80)
bark_action(my_dog)
sleep(0.2)
bark_action(my_dog)
sleep(0.8)
bark_action(my_dog)
def head_nod(step):
y = 0
r = 0
p = 30
angs = []
for i in range(20):
r = round(10*sin(i*0.314), 2)
p = round(20*sin(i*0.314) + 10, 2)
angs.append([y, r, p])
my_dog.head_move(angs*step, immediately=False, speed=80)
def alert():
my_dog.do_action('stand', step_count=1, speed=90)
my_dog.rgb_strip.set_mode('breath', color='pink', bps=1, brightness=0.8)
while True:
print(
f'distance.value: {round(my_dog.ultrasonic.read_distance(), 2)} cm, touch {my_dog.dual_touch.read()}')
# alert
if my_dog.ultrasonic.read_distance() < 15 and my_dog.ultrasonic.read_distance() > 1:
my_dog.head_move([[0, 0, 0]], immediately=True, speed=90)
my_dog.tail_move([[0]], immediately=True, speed=90)
my_dog.rgb_strip.set_mode('bark', color='red', bps=2, brightness=0.8)
my_dog.do_action('backward', step_count=1, speed=98)
my_dog.wait_all_done()
lean_forward()
while len(my_dog.legs_action_buffer) > 0:
sleep(0.1)
my_dog.do_action('stand', step_count=1, speed=90)
sleep(0.5)
# relax
if my_dog.dual_touch.read() != 'N':
if len(my_dog.head_action_buffer) < 2:
head_nod(1)
my_dog.do_action('wag_tail', step_count=10, speed=80)
my_dog.rgb_strip.set_mode('listen', color="#8A2BE2", bps=0.35, brightness=0.8)
# calm
else:
my_dog.rgb_strip.set_mode('breath', color='pink', bps=1, brightness=0.8)
my_dog.tail_stop()
sleep(0.2)
if __name__ == "__main__":
try:
alert()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
5. 休息¶
PiDogは地面でうとうとし、周りの音を聞くと混乱して立ち上がり、誰が自分を起こしたのかを見ます。

コードの実行
cd ~/pidog/examples
sudo python3 5_rest.py
プログラムが実行されると、PiDogは地面に降りて、うとうとするかのように頭と尻尾を振ります。 同時に、音の方向センサーモジュールが動作しています。PiDogが騒音を聞くと、立ち上がって周りを見回し、その後困惑した表情を見せます。 そして再びうとうとします。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from preset_actions import shake_head
my_dog = Pidog()
sleep(0.1)
def loop_around(amplitude=60, interval=0.5, speed=100):
my_dog.head_move([[amplitude,0,0]], immediately=True, speed=speed)
my_dog.wait_all_done()
sleep(interval)
my_dog.head_move([[-amplitude,0,0]], immediately=True, speed=speed)
my_dog.wait_all_done()
sleep(interval)
my_dog.head_move([[0,0,0]], immediately=True, speed=speed)
my_dog.wait_all_done()
def is_sound():
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
if direction != 0:
return True
else:
return False
else:
return False
def rest():
my_dog.wait_all_done()
my_dog.do_action('lie', speed=50)
my_dog.wait_all_done()
while True:
# Sleeping
my_dog.rgb_strip.set_mode('breath', 'pink', bps=0.3)
my_dog.head_move([[0,0,-40]], immediately=True, speed=5)
my_dog.do_action('doze_off', speed=92)
# Cleanup sound detection
sleep(1)
is_sound()
# keep sleeping
while is_sound() is False:
my_dog.do_action('doze_off', speed=92)
sleep(0.2)
# If heard anything, wake up
# Set light to yellow and stand up
my_dog.rgb_strip.set_mode('boom', 'yellow', bps=1)
my_dog.body_stop()
my_dog.do_action('stand', speed=90)
my_dog.head_move([[0, 0, 0]], immediately=True, speed=80)
my_dog.wait_all_done()
# Look arround
loop_around(60, 1, 60)
sleep(0.5)
# tilt head and being confused
my_dog.speak('confused_3', volume=80)
my_dog.do_action('tilting_head_left', speed=80)
my_dog.wait_all_done()
sleep(1.2)
my_dog.head_move([[0, 0, -10]], immediately=True, speed=80)
my_dog.wait_all_done()
sleep(0.4)
# Shake head , mean to ignore it
shake_head(my_dog)
sleep(0.2)
# Lay down again
my_dog.rgb_strip.set_mode('breath', 'pink', bps=1)
my_dog.do_action('lie', speed=50)
my_dog.wait_all_done()
sleep(1)
if __name__ == "__main__":
try:
rest()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
6. 持ち上げられる¶
PiDogを地面から持ち上げてみてください。PiDogは飛べると感じ、スーパーマンのポーズで歓声をあげます。

コードの実行
cd ~/pidog/examples
sudo python3 6_be_picked_up.py
プログラムが実行されると、6軸IMUモジュールは常に垂直方向の加速度を計算します。 PiDogが無重力状態にあると計算された場合、スーパーマンのポーズをとり、歓声をあげます。 そうでない場合は、PiDogが平地にあると考え、立ち姿勢をとります。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
my_dog = Pidog()
sleep(0.1)
def fly():
my_dog.rgb_strip.set_mode('boom', color='red', bps=3)
my_dog.legs.servo_move([45, -45, 90, -80, 90, 90, -90, -90], speed=60)
my_dog.do_action('wag_tail', step_count=10, speed=100)
my_dog.speak('woohoo', volume=80)
my_dog.wait_legs_done()
sleep(1)
def stand():
my_dog.rgb_strip.set_mode('breath', color='green', bps=1)
my_dog.do_action('stand', speed=60)
my_dog.wait_legs_done()
sleep(1)
def be_picked_up():
isUp = False
upflag = False
downflag = False
stand()
while True:
ax = my_dog.accData[0]
print('ax: %s, is up: %s' % (ax, isUp))
# gravity : 1G = -16384
if ax < -18000: # if down, acceleration is in the same direction as gravity, ax < -1G
my_dog.body_stop()
if upflag == False:
upflag = True
if downflag == True:
isUp = False
downflag = False
stand()
if ax > -13000: # if up, acceleration is the opposite of gravity, ax will > -1G
my_dog.body_stop()
if upflag == True:
isUp = True
upflag = False
fly()
if downflag == False:
downflag = True
sleep(0.02)
if __name__ == "__main__":
try:
be_picked_up()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
7. 顔追跡¶
PiDogは静かに座っています。あなたが手をたたくと、PiDogはあなたの方を向き、あなたを見つけると挨拶します。
コードの実行
cd ~/pidog/examples
sudo python3 7_face_track.py
このコードを実行すると、PiDogはカメラを起動し、顔検出機能を有効にします。
ブラウザで http://+ PiDogのIP +/mjpg
(私の場合は「http://192.168.18.138:9000/mjpg」)にアクセスして、カメラの画像を確認できます。
その後、PiDogは座り、音の方向センサーモジュールをアクティベートして、拍手の方向を検出します。 PiDogが拍手(または他の音)を聞くと、音源の方向に頭を向けてあなたを探します。
あなたを見つけると(顔検出がオブジェクトを見つけると)、尻尾を振って吠えます。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from vilib import Vilib
from preset_actions import bark
my_dog = Pidog()
sleep(0.1)
def face_track():
Vilib.camera_start(vflip=False, hflip=False)
Vilib.display(local=True, web=True)
Vilib.human_detect_switch(True)
sleep(0.2)
print('start')
yaw = 0
roll = 0
pitch = 0
flag = False
direction = 0
my_dog.do_action('sit', speed=50)
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80)
my_dog.wait_all_done()
sleep(0.5)
# Cleanup sound detection by servos moving
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
while True:
if flag == False:
my_dog.rgb_strip.set_mode('breath', 'pink', bps=1)
# If heard somthing, turn to face it
if my_dog.ears.isdetected():
flag = False
direction = my_dog.ears.read()
pitch = 0
if direction > 0 and direction < 160:
yaw = -direction
if yaw < -80:
yaw = -80
elif direction > 200 and direction < 360:
yaw = 360 - direction
if yaw > 80:
yaw = 80
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80)
my_dog.wait_head_done()
sleep(0.05)
ex = Vilib.detect_obj_parameter['human_x'] - 320
ey = Vilib.detect_obj_parameter['human_y'] - 240
people = Vilib.detect_obj_parameter['human_n']
# If see someone, bark at him/her
if people > 0 and flag == False:
flag = True
my_dog.do_action('wag_tail', step_count=2, speed=100)
bark(my_dog, [yaw, 0, 0], pitch_comp=-40, volume=80)
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
if ex > 15 and yaw > -80:
yaw -= 0.5 * int(ex/30.0+0.5)
elif ex < -15 and yaw < 80:
yaw += 0.5 * int(-ex/30.0+0.5)
if ey > 25:
pitch -= 1*int(ey/50+0.5)
if pitch < - 30:
pitch = -30
elif ey < -25:
pitch += 1*int(-ey/50+0.5)
if pitch > 30:
pitch = 30
print('direction: %s |number: %s | ex, ey: %s, %s | yrp: %s, %s, %s '
% (direction, people, ex, ey, round(yaw, 2), round(roll, 2), round(pitch, 2)),
end='\r',
flush=True,
)
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=100)
sleep(0.05)
if __name__ == "__main__":
try:
face_track()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
Vilib.camera_close()
my_dog.close()
8. 腕立て伏せ¶
PiDogは運動好きなロボットで、あなたと一緒に腕立て伏せをします。

コードの実行
cd ~/pidog/examples
sudo python3 8_pushup.py
プログラムを実行すると、PiDogはプランクを行い、腕立て伏せと吠え声を繰り返します。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from preset_actions import push_up, bark
my_dog = Pidog()
sleep(0.5)
def main():
my_dog.legs_move([[45, -25, -45, 25, 80, 70, -80, -70]], speed=50)
my_dog.head_move([[0, 0, -20]], speed=90)
my_dog.wait_all_done()
sleep(0.5)
bark(my_dog, [0, 0, -20])
sleep(0.1)
bark(my_dog, [0, 0, -20])
sleep(1)
my_dog.rgb_strip.set_mode("speak", color="blue", bps=2)
while True:
push_up(my_dog, speed=92)
bark(my_dog, [0, 0, -40])
sleep(0.4)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
9. 遠吠え¶
PiDogはかわいい子犬だけでなく、勇ましい犬でもあります。遠吠えを聞いてみましょう!

コードの実行
cd ~/pidog/examples
sudo python3 9_howling.py
プログラムを実行すると、PiDogは地面に座って遠吠えします。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from preset_actions import howling
my_dog = Pidog()
sleep(0.5)
def main():
my_dog.do_action('sit', speed=50)
my_dog.head_move([[0, 0, 0]], pitch_comp=-40, immediately=True, speed=80)
sleep(0.5)
while True:
howling(my_dog)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()
10. バランス¶
PiDogには6軸IMUモジュールが搭載されているため、非常に優れたバランス感覚を持っています。
この例では、PiDogをテーブル上でスムーズに歩かせることができます。たとえテーブルの片側を持ち上げても、PiDogは緩やかな斜面でスムーズに歩くことができます。

コードの実行
cd ~/pidog/examples
sudo python3 10_balance.py
プログラムが実行されると、ターミナルにキーボードが表示されます。 以下のキーを入力して、斜面上でPiDogをスムーズに歩かせることができます。
キー |
機能 |
---|---|
W |
前進 |
E |
立つ |
A |
左に回る |
S |
後退 |
D |
右に回る |
R |
体を少し持ち上げる;顕著な上昇には複数回の押下が必要。 |
F |
体を少し下げる;顕著な下降には複数回の押下が必要。 |
コード
コードは 10_balance.py - Github にあります。
11. キーボードでPiDogを操作する¶
この例では、キーボードを使ってPiDogを操作します。ターミナルでこれらのキーを押すことで、PiDogに行動させることができます。
キー |
機能 |
キー |
機能 |
キー |
機能 |
---|---|---|---|---|---|
1 |
うとうとする |
q |
より大きく吠える |
a |
左に回る |
2 |
腕立て伏せ |
w |
前進 |
s |
後退 |
3 |
遠吠え |
e |
ハアハアする |
d |
右に回る |
4 |
体をねじる |
r |
尻尾を振る |
f |
頭を振る |
5 |
かく |
t |
頭を振る |
g |
ハイファイブ |
u |
頭をロールする |
U |
頭をロールする+ |
z |
横になる |
i |
頭をピッチする |
I |
頭をピッチする+ |
x |
立ち上がる |
o |
頭をロールする |
O |
頭をロールする+ |
c |
座る |
j |
頭をヨーする |
J |
頭をヨーする+ |
v |
伸びる |
k |
頭をピッチする |
K |
頭をピッチする+ |
m |
頭をリセットする |
l |
頭をヨーする |
L |
頭をヨーする+ |
W |
トロット |
コードの実行
cd ~/pidog/examples
sudo python3 11_keyboard_control.py
プログラムが実行されると、ターミナルにキーボードが表示されます。これで、ターミナルでキーボードを使ってPiDogを制御できます。
コード
コードは 11_keyboard_control.py - Github にあります。
12. アプリでPiDogを操作する¶
この例では、SunFounder Controller APPを使ってPiDogを操作します。
まずは携帯電話/タブレットにAPPをダウンロードし、PiDogが発信するホットスポットに接続し、SunFounder Controllerで独自のリモコンを作成してPiDogを操作します。
アプリでPiDogを操作する¶
APP Store(iOS) または Google Play(Android) から SunFounder Controller をインストールします。
sunfounder-controller
モジュールをインストールします。最初に
robot-hat
、vilib
、picar-x
モジュールをインストールする必要があります。詳細は 5. すべてのモジュールをインストールする(重要) を参照してください。cd ~ git clone https://github.com/sunfounder/sunfounder-controller.git cd ~/sunfounder-controller sudo python3 setup.py install
コードを実行します。
cd ~/pidog/examples sudo python3 12_app_control.py
コードを実行すると、以下のプロンプトが表示され、PiDogがネットワーク通信を正常に開始したことがわかります。
Running on: http://192.168.18.138:9000/mjpg * Serving Flask app "vilib.vilib" (lazy loading) * Environment: development * Debug mode: off * Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
PiDog
とSunfounder Controller
を接続します。コントローラーを実行します。
「接続成功」というプロンプトが表示されたら、右上隅の▶ボタンをタップします。
カメラが撮影した画像がアプリに表示され、これらのウィジェットでPiDogを操作できます。
ウィジェットの機能は以下の通りです。
A: 超音波モジュールの読み取り、つまり障害物の距離を検出します。
C: 顔検出のオン/オフを切り替えます。
D: PiDogの頭の傾き角度を制御します(頭を傾ける)。
E: 座る。
F: 立つ。
G: 横になる。
I: PiDogの頭を撫でる。
N: 吠える。
O: 尻尾を振る。
P: ハアハアする。
K: PiDogの動きを制御します(前進、後退、左右)。
Q: PiDogの頭の向きを制御します。
J: 音声制御モードに切り替えます。次の音声コマンドに対応しています:
forward
backward
turn left
turn right
trot
stop
lie down
stand up
sit
bark
bark harder
pant
wag tail
shake head
stretch
doze off
push-up
howling
twist body
scratch
handshake
high five
起動時に自動起動¶
アプリでPiDogを制御する際に、まずRaspberry Piにログインして 12_app_control.py
を実行してからアプリで接続するのは面倒です。
より簡潔な方法があります。PiDogが電源を入れるたびに 12_app_control.py
を自動的に実行するように設定できます。これにより、アプリを使ってPiDogに直接接続し、ロボット犬を簡単に制御できます。
どのように設定するか?
以下のコマンドを実行して、
pidog_app
アプリケーションをインストールおよび設定し、PiDogのWiFiを設定します。cd ~/pidog/bin sudo bash pidog_app_install.sh
最後に「y」と入力してPiDogを再起動します。
それ以降は、PiDogを電源オンにしてアプリで直接操作できます。
警告
他のスクリプトを実行したい場合は、まず pidog_app disable
を実行して自動起動機能をオフにしてください。
アプリプログラムの設定¶
以下のコマンドを入力して、アプリモードの設定を変更できます。
pidog_app <OPTION> [input]
- OPTION
-h
help
: ヘルプ、このメッセージを表示start
restart
:pidog_app
サービスを再起動stop
:pidog_app
サービスを停止disable
: 起動時に自動起動するapp_controller
プログラムを無効にするenable
: 起動時に自動起動するapp_controller
プログラムを有効にするclose_ap
: ホットスポットを閉じる、起動時に自動起動するホットスポットを無効にし、STAモードに切り替えるopen_ap
: ホットスポットを開く、起動時に自動起動するホットスポットを有効にするssid
: ホットスポットのSSID(ネットワーク名)を設定psk
: ホットスポットのパスワードを設定country
: ホットスポットの国コードを設定
13. ボール追跡¶
PiDogは静かに座っています。 それに赤いボールを前に置くと、立ち上がってボールを追いかけます。
コードの実行
cd ~/pidog/examples
sudo python3 13_ball_track.py
このコードを実行すると、PiDogはカメラを起動します。
ブラウザで http://+ PiDogのIP +/mjpg
(私の場合は「http://192.168.18.138:9000/mjpg」)にアクセスして、カメラの画像を確認できます。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from vilib import Vilib
from preset_actions import bark
my_dog = Pidog()
sleep(0.1)
STEP = 0.5
def delay(time):
my_dog.wait_legs_done()
my_dog.wait_head_done()
sleep(time)
def ball_track():
Vilib.camera_start(vflip=False, hflip=False)
Vilib.display(local=True, web=True)
Vilib.color_detect_switch(True)
sleep(0.2)
print('start')
yaw = 0
roll = 0
pitch = 0
flag = False
direction = 0
my_dog.do_action('stand', speed=50)
my_dog.head_move([[yaw, 0, pitch]], immediately=True, speed=80)
delay(0.5)
while True:
ball_x = Vilib.detect_obj_parameter['color_x'] - 320
ball_y = Vilib.detect_obj_parameter['color_y'] - 240
width = Vilib.detect_obj_parameter['color_w']
if ball_x > 15 and yaw > -80:
yaw -= STEP
elif ball_x < -15 and yaw < 80:
yaw += STEP
if ball_y > 25:
pitch -= STEP
if pitch < - 40:
pitch = -40
elif ball_y < -25:
pitch += STEP
if pitch > 20:
pitch = 20
print(f"yaw: {yaw}, pitch: {pitch}, width: {width}")
my_dog.head_move([[yaw, 0, pitch]], immediately=True, speed=100)
if width == 0:
pitch = 0
yaw = 0
elif width < 300:
if my_dog.is_legs_done():
if yaw < -30:
print("turn right")
my_dog.do_action('turn_right', speed=98)
elif yaw > 30:
print("turn left")
my_dog.do_action('turn_left', speed=98)
else:
my_dog.do_action('forward', speed=98)
sleep(0.02)
if __name__ == "__main__":
try:
ball_track()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
Vilib.camera_close()
my_dog.close()
基本機能を習得したい場合、またはいくつかの楽しい例を作成したい場合は、 ~/pidog/basic_examples
ディレクトリにPiDogの基本機能の例があります。
希望に応じて、以下のレッスンを使用してステップバイステップで習得することもできます。
4. 簡単なコーディング¶
ここでは、様々な機能を詳しく分析し、包括的な理解を目指します。 各サブトピックは特定の機能に特化しており、それらを理解し実装するのが容易になります。 パラメータの初期化、特定の動きの制御、センサー入力の組み込みなど、すべてを網羅しています。 以下のサブトピックをナビゲートして、Pidogとのコーディングの旅を始めましょう。
1. PiDogの初期化¶
PiDogの機能は Pidog
クラスに記述されており、このクラスのプロトタイプは以下のようになります。
Class: Pidog()
__init__(leg_pins=DEFAULT_LEGS_PINS,
head_pins=DEFAULT_HEAD_PINS,
tail_pin=DEFAULT_TAIL_PIN,
leg_init_angles=None,
head_init_angles=None,
tail_init_angle=None)
PiDogは、以下に示すようないくつかの方法でインスタンス化する必要があります。
初期化の最も単純なステップは以下の通りです。
# Pidogクラスをインポート
from pidog import Pidog
# PiDogのインスタンスを作成
my_dog = Pidog()
PiDogには12個のサーボがあり、インスタンス化する際に初期化することができます。
# Pidogクラスをインポート
from pidog import Pidog
# カスタム初期化サーボ角度でPiDogのインスタンスを作成
my_dog = Pidog(leg_init_angles = [25, 25, -25, -25, 70, -45, -70, 45],
head_init_angles = [0, 0, -25],
tail_init_angle= [0]
)
Pidog
クラスでは、サーボは3つのグループに分かれています。
leg_init_angles
: この配列では、8つの値が8つのサーボの角度を決定し、制御するサーボ(ピン番号)は2, 3, 7, 8, 0, 1, 10, 11
です。展開図からこれらのサーボの位置がわかります。head_init_angles
: 3つの値の配列で、PiDogの頭部のヨー、ロール、ピッチサーボ(番号 4, 6, 5
)を制御し、体のヨー、ロール、ピッチ、または偏向に反応します。tail_init_angle
: この配列には1つの値のみがあり、尾サーボ(9
)を制御するために専用です。
Pidog
は、サーボの順番が異なる場合にロボットをインスタンス化する際にサーボのシリアル番号を再定義することができます。
# Pidogクラスをインポート
from pidog import Pidog
# カスタム初期化ピン&サーボ角度でPiDogのインスタンスを作成
my_dog = Pidog(leg_pins=[2, 3, 7, 8, 0, 1, 10, 11],
head_pins=[4, 6, 5],
tail_pin=[9],
leg_init_angles = [25, 25, -25, -25, 70, -45, -70, 45],
head_init_angles = [0, 0, -25],
tail_init_angle= [0]
)
2. 脚の動き¶
PiDogの脚の動きは、以下の関数によって実装されています。
Pidog.legs_move(target_angles, immediately=True, speed=50)
target_angles
: 8つのサーボ角度の配列(角度グループと呼ばれる)からなる二次元配列です。これらの角度グループは、8つの足サーボの角度を制御するために使用されます。複数の角度グループが書かれている場合、実行されていない角度グループはキャッシュに保存されます。immediately
: 関数を呼び出すとき、このパラメータをTrue
に設定すると、キャッシュはすぐにクリアされて新しく書かれた角度グループが実行されます。パラメータを``False``に設定すると、新しく書かれた角度グループが実行キューに追加されます。speed
: 角度グループの実行速度。
いくつかの一般的な使用方法を以下に示します:
即座に行動をとる。
from pidog import Pidog
import time
my_dog = Pidog()
# 半立ち
my_dog.legs_move([[45, 10, -45, -10, 45, 10, -45, -10]], speed=50)
実行キューにいくつかの角度グループを追加する。
from pidog import Pidog
import time
my_dog = Pidog()
# 半立ち
my_dog.legs_move([[45, 10, -45, -10, 45, 10, -45, -10]], speed=50)
# 複数のアクション
my_dog.legs_move([[45, 35, -45, -35, 80, 70, -80, -70],
[90, -30, -90, 30, 80, 70, -80, -70],
[45, 35, -45, -35, 80, 70, -80, -70]], immediately=False, speed=30)
10秒以内に繰り返し行う。
from pidog import Pidog
import time
my_dog = Pidog()
# 半立ち
my_dog.legs_move([[45, 10, -45, -10, 45, 10, -45, -10]], speed=50)
# 腕立て伏せの準備
my_dog.legs_move([[45, 35, -45, -35, 80, 70, -80, -70]], immediately=False, speed=20)
# 腕立て伏せ
for _ in range(99):
my_dog.legs_move([[90, -30, -90, 30, 80, 70, -80, -70],
[45, 35, -45, -35, 80, 70, -80, -70]], immediately=False, speed=30)
# 10秒間維持
time.sleep(10)
# 停止して半立ち
my_dog.legs_move([[45, 10, -45, -10, 45, 10, -45, -10]], immediately=True, speed=50)
PiDogの脚制御には、以下の関数も使用できます:
Pidog.is_legs_done()
この関数は、キャッシュ内の角度グループが実行されたかどうかを判断するために使用されます。実行された場合は True
を返し、そうでない場合は False
を返します。
Pidog.wait_legs_done()
キャッシュ内の角度グループが実行されるまでプログラムを一時停止します。
Pidog.legs_stop()
キャッシュ内の角度グループを空にします。
3. 頭の動き¶
PiDogの頭部サーボの制御は、以下の関数によって実装されています。
Pidog.head_move(target_yrps, roll_comp=0, pitch_comp=0, immediately=True, speed=50)
target_angles
: 3つのサーボ角度の配列(角度グループと呼ばれる)からなる二次元配列です。これらの角度グループは、頭部の3つのサーボの角度を制御するために使用されます。複数の角度グループが書かれている場合、実行されていない角度グループはキャッシュに保存されます。roll_comp
: ロール軸に対する角度補正を提供します。pitch_comp
: ピッチ軸に対する角度補正を提供します。immediately
: 関数を呼び出すとき、このパラメータをTrue
に設定すると、キャッシュはすぐにクリアされて新しく書かれた角度グループが実行されます。パラメータをFalse
に設定すると、新しく書かれた角度グループが実行キューに追加されます。speed
: 角度グループの実行速度。
PiDogの頭部サーボ制御には、以下のサポート機能もあります:
Pidog.is_head_done()
実行される予定のバッファ内のすべての頭部アクションが完了しているかどうか
Pidog.wait_head_done()
バッファ内のすべての頭部アクションが実行されるまで待ちます
Pidog.head_stop()
バッファ内の足のすべての頭部アクションをクリアし、頭部サーボを停止させます
以下は一般的な使用例です:
5回うなずく。
from pidog import Pidog
import time
my_dog = Pidog()
for _ in range(5):
my_dog.head_move([[0, 0, 30],[0, 0, -30]], speed=80)
my_dog.wait_head_done()
time.sleep(0.5)
10秒間頭を振る。
from pidog import Pidog
import time
my_dog = Pidog()
for _ in range(99):
my_dog.head_move([[30, 0, 0],[-30, 0, 0]], immediately=False, speed=30)
# 10秒間維持
time.sleep(10)
my_dog.head_move([[0, 0, 0]], immediately=True, speed=80)
座っているか半立ちしているかにかかわらず、PiDogは頭を振るときに頭を水平に保ちます。
from pidog import Pidog
import time
my_dog = Pidog()
# アクションリスト
shake_head = [[30, 0, 0],[-30, 0, 0]]
half_stand_leg = [[45, 10, -45, -10, 45, 10, -45, -10]]
sit_leg = [[30, 60, -30, -60, 80, -45, -80, 45]]
while True:
# 半立ちで頭を振る
my_dog.legs_move(half_stand_leg, speed=30)
for _ in range(5):
my_dog.head_move(shake_head, pitch_comp=0, speed=50)
my_dog.wait_head_done()
time.sleep(0.5)
# 座って頭を振る
my_dog.legs_move(sit_leg, speed=30)
for _ in range(5):
my_dog.head_move(shake_head, pitch_comp=-30, speed=50)
my_dog.wait_head_done()
time.sleep(0.5)
4. 尾の動き¶
以下はPiDogの尾を制御する関数です。この関数は 2. 脚の動き と似ています。
Pidog.tail_move(target_angles, immediately=True, speed=50)
target_angles
: 1つのサーボ角度の配列(角度グループと呼ばれる)からなる二次元配列です。これらの角度グループは、尾のサーボの角度を制御するために使用されます。複数の角度グループが書かれている場合、実行されていない角度グループはキャッシュに保存されます。immediately
: 関数を呼び出すとき、このパラメータをTrue
に設定すると、キャッシュはすぐにクリアされて新しく書かれた角度グループが実行されます。パラメータをFalse
に設定すると、新しく書かれた角度グループが実行キューに追加されます。speed
: 角度グループの実行速度。
PiDogの尾サーボ制御には、以下のサポート機能もあります:
Pidog.is_tail_done()
実行される予定のバッファ内のすべての尾のアクションが完了しているかどうか
Pidog.wait_tail_done()
バッファ内のすべての尾のアクションが実行されるまで待ちます
Pidog.tail_stop()
バッファ内の足のすべての尾のアクションをクリアし、尾サーボを停止させます
以下は一般的な使用例です:
10秒間尾を振る。
from pidog import Pidog
import time
my_dog = Pidog()
for _ in range(99):
my_dog.tail_move([[30],[-30]], immediately=False, speed=30)
# 10秒間維持
time.sleep(10)
my_dog.tail_stop()
5. すべてのアクションの停止¶
これまでの章で、PiDogのサーボ制御が3つのスレッドに分かれていることがわかります。 これにより、PiDogの頭部と体が同時に動くことができ、たとえ2行のコードであっても実行できます。
ここでは、3つのサーボスレッドと共に動作するいくつかの関数を紹介します:
Pidog.wait_all_done()
足のアクションバッファ、頭部バッファ、尾バッファのすべてのアクションが実行されるのを待ちます
Pidog.body_stop()
足、頭部、尾のすべてのアクションを停止します
Pidog.stop_and_lie()
足、頭部、尾のすべてのアクションを停止し、その後 横になる
ポーズにリセットします
Pidog.close()
すべてのアクションを停止し、 横になる
ポーズにリセットし、プログラムを終了するときに通常使用されるすべてのスレッドを閉じます
以下は一般的な使用例です:
from pidog import Pidog
import time
my_dog = Pidog()
try:
# pushup prepare
my_dog.legs_move([[45, 35, -45, -35, 80, 70, -80, -70]], speed=30)
my_dog.head_move([[0, 0, 0]], pitch_comp=-10, speed=80)
my_dog.wait_all_done() # wait all the actions to be done
time.sleep(0.5)
# pushup
leg_pushup_action = [
[90, -30, -90, 30, 80, 70, -80, -70],
[45, 35, -45, -35, 80, 70, -80, -70],
]
head_pushup_action = [
[0, 0, -30],
[0, 0, 20],
]
# fill action buffers
for _ in range(50):
my_dog.legs_move(leg_pushup_action, immediately=False, speed=50)
my_dog.head_move(head_pushup_action, pitch_comp=-10, immediately=False, speed=50)
# show buffer length
print(f"legs buffer length (start): {len(my_dog.legs_action_buffer)}")
# keep 5 second & show buffer length
time.sleep(5)
print(f"legs buffer length (5s): {len(my_dog.legs_action_buffer)}")
# stop action & show buffer length
my_dog.stop_and_lie()
print(f"legs buffer length (stop): {len(my_dog.legs_action_buffer)}")
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
print("closing ...")
my_dog.close() # close all the servo threads
6. プリセットアクションを実行する¶
PiDogのライブラリには、よく使われるアクションが予め記述されています。 以下の関数を呼び出して、PiDogにこれらのアクションを直接行わせることができます。
Pidog.do_action(action_name, step_count=1, speed=50)
action_name
: アクション名、以下の文字列が記述できます。"sit"
"half_sit"
"stand"
"lie"
"lie_with_hands_out"
"forward"
"backward"
"turn_left"
"turn_right"
"trot"
"stretch"
"pushup"
"doze_off"
"nod_lethargy"
"shake_head"
"tilting_head_left"
"tilting_head_right"
"tilting_head"
"head_bark"
"head_up_down"
"wag_tail"
step_count
: このアクションを何回実行するか。speed
: アクションを実行する速度。
使用例を以下に示します:
腕立て伏せを10回実行し、その後床に座ってかわいらしい態度をとる。
from pidog import Pidog
import time
my_dog = Pidog()
try:
# pushup
my_dog.do_action("half_sit", speed=60)
my_dog.do_action("pushup", step_count=10, speed=60)
my_dog.wait_all_done()
# act cute
my_dog.do_action("sit", speed=60)
my_dog.do_action("wag_tail", step_count=100,speed=90)
my_dog.do_action("tilting_head", step_count=5, speed=20)
my_dog.wait_head_done()
my_dog.stop_and_lie()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
print("closing ...")
my_dog.close()
7. PiDogが話す¶
PiDogは音を出すことができ、実際にはオーディオの一部を再生しています。
これらのオーディオは pidog\sounds
のパスに保存されており、以下の関数を呼び出して再生することができます。
Pidog.speak(name)
name
: ファイル名(接尾辞なし)、例えば"angry"
。Pidog
は以下のオーディオを提供しています。"angry"
"confused_1"
"confused_2"
"confused_3"
"growl_1"
"growl_2"
"howling"
"pant"
"single_bark_1"
"single_bark_2"
"snoring"
"woohoo"
使用例を以下に示します:
# !/usr/bin/env python3
''' play sound effecfs
Note that you need to run with "sudo"
API:
Pidog.speak(name, volume=100)
play sound effecf in the file "../sounds"
- name str, file name of sound effect, no suffix required, eg: "angry"
- volume int, volume 0-100, default 100
'''
from pidog import Pidog
import os
import time
# change working directory
abspath = os.path.abspath(os.path.dirname(__file__))
# print(abspath)
os.chdir(abspath)
my_dog = Pidog()
print("\033[033mNote that you need to run with \"sudo\", otherwise there may be no sound.\033[m")
# my_dog.speak("angry")
# time.sleep(2)
for name in os.listdir('../sounds'):
name = name.split('.')[0] # remove suffix
print(name)
my_dog.speak(name)
# my_dog.speak(name, volume=50)
time.sleep(3) # Note that the duration of each sound effect is different
print("closing ...")
my_dog.close()
8. 距離の読み取り¶
頭部にある超音波モジュールを通じて、PiDogは前方の障害物を検出することができます。
超音波モジュールは、2cmから400cm離れた物体を検出することができます。
以下の関数を使用すると、距離を浮動小数点数として読み取ることができます。
Pidog.ultrasonic.read_distance()
使用例を以下に示します:
from pidog import Pidog
import time
my_dog = Pidog()
while True:
distance = my_dog.ultrasonic.read_distance()
distance = round(distance,2)
print(f"Distance: {distance} cm")
time.sleep(0.5)
9. PiDogのRGBストリップ¶
PiDogの胸にはRGBストリップがあり、PiDogはこれを使って感情を表現することができます。
以下の関数を呼び出して制御することができます。
Pidog.rgb_strip.set_mode(style='breath', color='white', bps=1, brightness=1):
style
: RGBストリップの照明表示モードで、以下の値が利用可能です。breath
boom
bark
color
: RGBストリップのライトの色を表示します。16進数のRGB値を入力することができます。例えば#a10a0a
、または以下の色名。"white"
"black"
"white"
"red"
"yellow"
"green"
"blue"
"cyan"
"magenta"
"pink"
brightness
: RGBストリップライトの表示の明るさを設定します。0から1までの浮動小数点値を入力することができます。例えば0.5
。delay
: Float, アニメーションの表示速度で、値が小さいほど変化が速くなります。
RGBストリップを無効にするには、以下のステートメントを使用します。
Pidog.rgb_strip.close()
使用例を以下に示します:
from pidog import Pidog
import time
my_dog = Pidog()
while True:
# style="breath", color="pink"
my_dog.rgb_strip.set_mode(style="breath", color='pink')
time.sleep(3)
# style:"boom", color="#a10a0a"
my_dog.rgb_strip.set_mode(style="bark", color="#a10a0a")
time.sleep(3)
# style:"boom", color="#a10a0a", brightness=0.5, bps=2.5
my_dog.rgb_strip.set_mode(style="boom", color="#a10a0a", bps=2.5, brightness=0.5)
time.sleep(3)
# close
my_dog.rgb_strip.close()
time.sleep(2)
10. IMU読み取り¶
6軸IMUモジュールを通じて、PiDogは斜面に立っているか、持ち上げられているかを判断することができます。
6軸IMUモジュールには、3軸加速度計と3軸ジャイロスコープが搭載されており、3方向の加速度と角速度を測定することができます。
注釈
モジュールを使用する前に、正しく組み立てられていることを確認してください。モジュールのラベルで、逆さまになっているかどうかを確認できます。
加速度は次のように読み取ります:
ax, ay, az = Pidog.accData
PiDogが水平に置かれている場合、x軸の加速度(つまりax)は重力加速度(1g)に近く、値は-16384に近くなります。 y軸とx軸の値は0に近いです。
角速度を読み取るには次の方法を使用します:
gx, gy, gz = my_dog.gyroData
PiDogが水平に置かれている場合、3つの値はすべて0に近いです。
6軸モジュールの使用例をいくつか紹介します:
リアルタイムの加速度、角速度を読み取る
from pidog import Pidog import time my_dog = Pidog() my_dog.do_action("pushup", step_count=10, speed=20) while True: ax, ay, az = my_dog.accData gx, gy, gz = my_dog.gyroData print(f"accData: {ax/16384:.2f} g ,{ay/16384:.2f} g, {az/16384:.2f} g gyroData: {gx} °/s, {gy} °/s, {gz} °/s") time.sleep(0.2) if my_dog.is_legs_done(): break my_dog.stop_and_lie() my_dog.close()
PiDogの体の傾き角度を計算する
from pidog import Pidog import time import math my_dog = Pidog() while True: ax, ay, az = my_dog.accData body_pitch = math.atan2(ay,ax)/math.pi*180%360-180 print(f"Body Degree: {body_pitch:.2f} °" ) time.sleep(0.2) my_dog.close()
傾いている間、PiDogは目線を水平に保つ。
from pidog import Pidog import time import math my_dog = Pidog() while True: ax, ay, az = my_dog.accData body_pitch = math.atan2(ay,ax)/math.pi*180%360-180 my_dog.head_move([[0, 0, 0]], pitch_comp=-body_pitch, speed=80) time.sleep(0.2) my_dog.close()
11. 音の方向検出¶
PiDogには音の方向を検出するサウンド方向センサーモジュールが搭載されており、近くで手を叩くことでトリガーできます。
このモジュールの使用は、次の関数を呼び出すことで簡単に行えます。
Pidog.ears.isdetected()
音が検出されると True
を返し、そうでなければ False
を返します。
Pidog.ears.read()
この関数は音源の方向を返します。範囲は0から359で、音が前方から来る場合は0を、右側から来る場合は90を返します。
このモジュールの使用例は以下の通りです:
from pidog import Pidog
my_dog = Pidog()
while True:
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
print(f"sound direction: {direction}")
12. PiDogの頭を撫でる¶
PiDogの頭にあるタッチスイッチは、どのように触れるかを検出することができます。以下の関数を呼び出して使用できます。
Pidog.dual_touch.read()
モジュールを左から右へ(PiDogの向きにとって前から後ろへ)触れると、
"LS"
を返します。モジュールを右から左へ触れると、
"RS"
を返します。モジュールの左側を触れると、
"L"
を返します。モジュールの右側を触れると、
"R"
を返します。モジュールが触れられていない場合は、
"N"
を返します。
使用例を以下に示します:
from pidog import Pidog
import time
my_dog = Pidog()
while True:
touch_status = my_dog.dual_touch.read()
print(f"touch_status: {touch_status}")
time.sleep(0.5)
13. その他¶
以下のアドレスでは、PiDogのより基本的な機能の使用方法を説明しています:
-
Vilibは、Raspberry Piカメラ用にSunFounderが開発したライブラリです。
写真撮影、ビデオ録画、ポーズ検出、顔検出、動き検出、画像分類など、実用的な機能が含まれています。
-
SunFounderコントローラーは、ユーザーが自分のロボットを制御するためのカスタムコントローラーを作成したり、IoTプラットフォームとして使用したりできるアプリケーションです。
ハードウェア¶
コードを書いているとき、各モジュールの動作方法や各ピンの役割を知る必要があるかもしれません。この章では、各モジュールの機能、技術的なパラメーター、動作原理について説明します。
ロボットHAT¶
Robot HAT は、Raspberry Piを迅速にロボットに変換することができる多機能拡張ボードです。 MCUが搭載されており、Raspberry PiのPWM出力とADC入力を拡張し、 モータードライバーチップ、I2Sオーディオモジュール、モノスピーカーも備えています。 また、Raspberry Pi自体から引き出されるGPIOもあります。
スピーカーも付属しており、 バックグラウンドミュージック、効果音、TTS機能の実装を行うことで、プロジェクトをより面白くすることができます。
7-12V PH2.0 5ピンの電源入力には2つのバッテリーインジケーター、1つの充電インジケーター、1つの電源インジケーターが付いています。 ボードには、ユーザーが簡単にいくつかの効果をテストできるLEDとボタンもあります。

- 電源ポート
7-12V PH2.0 3ピンの電源入力。
Raspberry PiとロボットHATを同時に供給。
- 電源スイッチ
ロボットHATの電源をオン/オフします。
電源ポートに電源を接続すると、Raspberry Piが起動します。しかし、ロボットHATを有効にするには電源スイッチをONに切り替える必要があります。
- Type-C USBポート
Type-Cケーブルを差し込んでバッテリーを充電します。
同時に、充電インジケーターが赤色で点灯します。
バッテリーが完全に充電されると、充電インジケーターが消灯します。
バッテリーが完全に充電された約4時間後にUSBケーブルがまだ接続されている場合、充電インジケーターが点滅してプロンプトが表示されます。
- デジタルピン
4チャンネルのデジタルピン、D0-D3。
- ADCピン
4チャンネルのADCピン、A0-A3。
- PWMピン
12チャンネルのPWMピン、P0-P11。
- 左/右モーターポート
2チャンネルのXH2.54モーターポート。
左ポートはGPIO 4に、右ポートはGPIO 5に接続されています。
- I2CピンとI2Cポート
I2Cピン: P2.54 4ピンインターフェース。
I2Cポート: SH1.0 4ピンインターフェースで、QWIICとSTEMMA QTと互換性があります。
これらのI2Cインターフェースは、GPIO2(SDA)とGPIO3(SCL)を介してRaspberry PiのI2Cインターフェースに接続されています。
- SPIピン
P2.54 7ピンSPIインターフェース。
- UARTピン
P2.54 4ピンインターフェース。
- RSTボタン
Ezblockを使用する場合、RSTボタンはEzblockプログラムを再起動するためのボタンとして機能します。
Ezblockを使用していない場合、RSTボタンには定義済みの機能はなく、必要に応じて完全にカスタマイズできます。
- USRボタン
USRボタンの機能はプログラミングによって設定できます。(押し込むと入力「0」;放すと入力「1」が生成されます。)
- バッテリーインジケーター
電圧が7.6Vを超えると2つのLEDが点灯します。
7.15Vから7.6Vの範囲で1つのLEDが点灯します。
7.15V以下では、両方のLEDが消灯します。
- スピーカーとスピーカーポート
スピーカー: これは2030オーディオチャンバースピーカーです。
スピーカーポート: ロボットHATにはオンボードI2Sオーディオ出力が装備されており、2030オーディオチャンバースピーカーとともにモノサウンド出力を提供します。
カメラモジュール¶
説明

これはOV5647センサーを搭載した5MPのRaspberry Piカメラモジュールです。プラグアンドプレイで、Raspberry PiのCSI(カメラシリアルインターフェース)ポートに含まれているリボンケーブルを接続するだけで使用できます。
このボードは小型で、約25mm x 23mm x 9mmのサイズで、重さは3gで、モバイルやその他のサイズや重量に制約のあるアプリケーションに最適です。カメラモジュールはネイティブ解像度が5メガピクセルで、2592 x 1944ピクセルで静止画をキャプチャし、1080p30、720p60、640x480p90のビデオもサポートしています。
注釈
このモジュールは写真とビデオのキャプチャのみが可能で、音声はキャプチャできません。
仕様
静止画の解像度: 2592×1944
サポートされるビデオの解像度: 1080p/30 fps、720p/ 60fpsおよび640 x480p 60/90のビデオ録画
絞り値(F): 1.8
視野角: 65度
寸法: 24mmx23.5mmx8mm
重さ: 3g
インターフェース: CSIコネクタ
サポートされるOS: Raspberry Pi OS(最新バージョンを推奨)
カメラモジュールの組み立て
カメラモジュールまたはRaspberry Piには、平らなプラスチックコネクタがあります。黒い固定スイッチを注意して引き出し、固定スイッチが部分的に引き出された状態にします。 FFCケーブルを示された方向にプラスチックコネクタに挿入し、固定スイッチを元の位置に押し戻します。
FFCワイヤが正しく取り付けられている場合、引っ張るとまっすぐで取り出されなくなります。そうでない場合は、再度取り付けてください。


警告
電源を入れた状態でカメラを取り付けないでください。それはカメラを壊す可能性があります。
サウンド方向センサー¶

これはサウンド方向認識モジュールです。3つのマイクロフォンが搭載されており、全方向からの音源を検出することができます。また、音信号の処理と音源方向の計算に使用されるTR16F064Bが搭載されています。このモジュールの最小偵察単位は20度で、データ範囲は0〜360です。
データ伝送プロセス:メインコントローラがBUSYピンをプルアップし、TR16F064Bが方向を監視を開始します。064Bが方向を認識すると、BUSYピンをプルダウンします。 メインコントロールがBUSYがローであることを検出すると、16ビットの任意データを064Bに送信し(MSB送信に従う)、064Bによって処理された音方向データである16ビットデータを受け入れます。 完了後、メインコントロールはBUSYピンをプルアップして再び方向を検出します。
仕様
電源:3.3V
通信:SPI
コネクタ:PH2.0 7P
音声認識角度範囲360°
音声認識角度精度〜10°
ピンアウト
GND - グラウンド入力
VCC - 3.3V 電源入力
MOSI - SPI MOSI
MISO - SPI MISO
SCLK - SPIクロック
CS - SPIチップセレクト
BUSY - ビジー検出
6軸IMU¶

6軸IMUはSH3001をベースにしています。
SH3001は6軸IMU(慣性計測ユニット)です。3軸ジャイロスコープと3軸加速度計を統合しています。サイズが小さく、消費電力が少ないため、消費者向け電子機器の市場向けアプリケーションに適しており、高精度のリアルタイム角速度および線形加速度データを提供できます。SH3001は優れた温度安定性を持ち、-40°Cから85°Cの動作範囲内で高い解像度を維持できます。
通常、スマートフォン、タブレットコンピュータ、マルチロータードローン、スマート掃除機、ページ送りレーザーポインター、AR/VR、スマートリモコン、スマートブレスレットなどの製品に使用されます。
仕様
電源供給: 3.3V
通信: IIC
コネクタ: SH1.0 4P
ピン配置
GND - グラウンド入力
VCC - 電源供給入力
SDA - IIC SDA
SCL - IIC SCL
デュアルタッチセンサー¶

2つのttp223タッチセンサーをベースにしたデュアルチャンネルタッチセンサーです。 タッチ信号が検出されると、対応するピンレベルが低くなります。
TTP223は、1つのタッチキーを提供するタッチパッド検出ICです。 このタッチ検出ICは、異なるパッドサイズの従来の直接キーを置き換えるために特別に設計されています。 低消費電力と広い動作電圧が特徴です。
仕様
電源供給:2.0V〜5.5V
シグナル出力:デジタル信号
コネクタ:SH1.0 4P
ピン配置
GND - グラウンド入力
VCC - 電源供給入力
SIG1 - タッチシグナル1、低レベルはタッチを意味します
SIG2 - タッチシグナル2、低レベルはタッチを意味します
11チャンネルライトボード¶

これは11チャンネルのRGB LEDモジュールで、SLED1735チップによって制御される11個のRGB LEDを搭載しています。
SLED1734は最大256個のLEDと75個のRGB LEDを駆動できます。 SLED1734によって制御されるLEDマトリックスでは、各LEDにはオン/オフ、点滅、ブリンク、呼吸灯、自動同期など多くの機能が備わっています。 このチップにはPWM(パルス幅変調)技術が組み込まれており、256段階の明るさ調整が可能です。また、16段階のドット補正機能も備えています。
仕様
電源供給: 3.3V
通信: IIC
コネクタ: SH1.0 4P
LED: 3535 RGB LED
ピン配置
GND - グラウンド入力
VCC - 電源供給入力
SDA - IIC SDA
SCL - IIC SCL
超音波モジュール¶

TRIG: トリガーパルス入力
ECHO: エコーパルス出力
GND: グラウンド
VCC: 5V 電源
これはHC-SR04超音波距離センサーで、非接触測定を2cmから400cmまで、最大3mmの範囲精度で提供します。このモジュールには、超音波トランスミッター、レシーバー、および制御回路が含まれています。
測定プロジェクトに簡単に使用できるように、VCC(電源)、Trig(トリガー)、Echo(受信)、GND(グラウンド)の4ピンを接続するだけです。
特徴
動作電圧:DC5V
動作電流:16mA
動作周波数:40Hz
最大範囲:500cm
最小範囲:2cm
トリガー入力信号:10uS TTLパルス
エコー出力信号:入力TTLレベル信号と距離の比例
コネクタ:XH2.54-4P
寸法:46x20.5x15 mm
原理
基本原理は以下の通りです:
少なくとも10usの高レベル信号でIOトリガーを使用します。
モジュールは40kHzの超音波の8サイクルバーストを送信し、パルス信号が受信されるかどうかを検出します。
エコーは信号が戻った場合に高レベルを出力します。高レベルの持続時間は、放出から戻るまでの時間です。
距離 = (高レベル時間 x 音速(340M/S))/ 2
公式:
us / 58 = センチメートル距離
us / 148 = インチ距離
距離 = 高レベル時間 x 速度(340M/S) / 2
アプリケーションノート
このモジュールは電源投入時に接続されるべきではありません。必要な場合は、モジュールのGNDを最初に接続してください。そうしないと、モジュールの動作に影響を与えます。
測定対象の面積は少なくとも0.5平方メートルで、できるだけ平らでなければなりません。そうでないと、結果に影響します。
18650 バッテリー¶

VCC: バッテリーの正極端子。ここには2つのVCCとGNDがあり、電流を増加させ抵抗を減少させるためです。
中央: 2つのセル間の電圧をバランスさせ、バッテリーを保護します。
GND: バッテリーの負極端子。
これは、容量が2000mAhの2つの18650バッテリーから成るSunFounderによるカスタムバッテリーパックです。コネクタはPH2.0-5Pで、Robot HATに挿入した後直接充電できます。
特徴
バッテリー充電: 5V/2A
バッテリー出力: 5V/3A
バッテリー容量: 3.7V 2000mAh x 2
バッテリー寿命: <90分
バッテリー充電時間: >130分
コネクタ: PH2.0, 5P
付録¶
Filezillaソフトウェア¶

ファイル転送プロトコル(FTP)は、コンピュータネットワーク上のサーバーからクライアントへのコンピュータファイルの転送に使用される標準通信プロトコルです。
Filezillaはオープンソースのソフトウェアで、FTPだけでなくFTP over TLS(FTPS)およびSFTPもサポートしています。Filezillaを使用して、ローカルファイル(写真や音声など)をRaspberry Piにアップロードしたり、Raspberry Piからローカルにファイルをダウンロードしたりすることができます。
ステップ1: Filezillaのダウンロード
Filezillaのクライアントを Filezillaの公式ウェブサイト からダウンロードします。Filezillaには非常に良いチュートリアルがありますので、 ドキュメンテーション - Filezilla を参照してください。
ステップ2: Raspberry Piに接続
クイックインストールの後、Filezillaを開いて FTPサーバーに接続 します。接続する方法は3つありますが、ここでは クイック接続 バーを使用します。 ホスト名/IP 、 ユーザー名 、 パスワード 、 ポート(22) を入力し、 クイック接続 をクリックするか、 Enter キーを押してサーバーに接続します。

注釈
クイック接続はログイン情報をテストする良い方法です。永続的なエントリを作成したい場合は、クイック接続に成功した後に ファイル -> 現在の接続をサイトマネージャーにコピー を選択し、名前を入力して OK をクリックします。次回から、以前保存したサイトを選択して ファイル -> サイトマネージャー 内で接続できます。

ステップ3: ファイルのアップロード/ダウンロード
ファイルをアップロードするには、ローカルファイルをRaspberry Piにドラッグアンドドロップするか、Raspberry Pi内のファイルをローカルにダウンロードすることができます。

IPアドレスの取得¶
IPアドレスを知る方法はたくさんあり、そのうちの2つを以下に示します。
ルーター経由での確認
ルーターにログインする権限がある場合(家庭用ネットワークなど)、ルーターの管理インターフェースでRaspberry Piに割り当てられたアドレスを確認できます。
Raspberry Pi OSのデフォルトのホスト名はraspberrypiですので、それを見つける必要があります(ArchLinuxARMシステムを使用している場合はalarmpiを見つけてください)。
ネットワークセグメントスキャン
ネットワークスキャンを使用してRaspberry PiのIPアドレスを調べることもできます。 Advanced IP scanner などのソフトウェアを適用できます。
設定されたIP範囲をスキャンすると、すべての接続デバイスの名前が表示されます。同様に、Raspberry Pi OSのデフォルトのホスト名はraspberrypiですので、変更していない場合はそれを使用します。
Powershellを使用してOpenSSHをインストール¶
ssh <username>@<hostname>.local
(または ssh <username>@<IPアドレス>
)を使用してRaspberry Piに接続しようとすると、次のエラーメッセージが表示される場合があります。
ssh: The term 'ssh' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
これは、コンピューターシステムが古すぎて OpenSSH が事前にインストールされていないことを意味します。以下のチュートリアルに従って、手動でインストールする必要があります。
Windowsデスクトップの検索ボックスに
powershell
と入力し、Windows PowerShell
を右クリックし、表示されるメニューから管理者として実行
を選択します。以下のコマンドを使用して
OpenSSH.Client
をインストールします。Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
インストール後、以下の出力が返されます。
Path : Online : True RestartNeeded : False
次のコマンドを使用してインストールを確認します。
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
これにより、
OpenSSH.Client
が正常にインストールされたことがわかります。Name : OpenSSH.Client~~~~0.0.1.0 State : Installed Name : OpenSSH.Server~~~~0.0.1.0 State : NotPresent
警告
上記のプロンプトが表示されない場合、Windowsシステムがまだ古い可能性があり、 PuTTY のようなサードパーティのSSHツールをインストールすることをお勧めします。
今、PowerShellを再起動し、管理者として実行し続けます。この時点で、
ssh
コマンドを使用してRaspberry Piにログインできるようになり、以前に設定したパスワードを入力するように求められます。
PuTTY¶
Windowsユーザーの場合、SSHのいくつかのアプリケーションを使用できます。ここでは、 PuTTY をお勧めします。
ステップ 1
PuTTYをダウンロードします。
ステップ 2
PuTTYを開き、左側のツリー構造の セッション をクリックします。 ホスト名(またはIPアドレス) のテキストボックスにRPiのIPアドレスを入力し、 ポート の下に 22 を入力します(デフォルトでは22です)。

ステップ 3
Open をクリックします。Raspberry Piに初めてログインすると、セキュリティの警告が表示されます。 はい をクリックしてください。
ステップ 4
PuTTYウィンドウが login as:
とプロンプトを表示した場合、 pi (RPiのユーザー名)と パスワード raspberry
(デフォルトのパスワード、変更していない場合)を入力します。
注釈
パスワードを入力すると、文字がウィンドウに表示されないのは正常です。必要なのは正しいパスワードを入力することです。
PuTTYの横に inactive
と表示された場合、接続が切断されたことを意味し、再接続する必要があります。

ステップ 5
ここで、Raspberry Piに接続され、次のステップを実行する時間です。
著作権に関するお知らせ¶
このマニュアルに含まれるテキスト、画像、コードなどのすべての内容は、SunFounder Companyによって所有されています。これらのコンテンツは、関連する法規制および著作権法の下で、著者および関連する権利保持者の法的権利を侵害することなく、個人的な