SunFounder Raspberry Pi ロボット - PiDog

_images/pidog.jpg

私たちの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などの言語でプログラミングを学ぶことができます。

_images/image10.jpeg

電源アダプター

電源ソケットに接続するために、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カード

インストール手順

  1. Raspberry Pi Imager のRaspberry Piソフトウェアダウンロードページを訪れてください。お使いのオペレーティングシステムに対応するImagerバージョンを選択します。ファイルをダウンロードして開き、インストールを開始します。

    _images/os_install_imager.png
  2. インストール中に、オペレーティングシステムによってはセキュリティプロンプトが表示される場合があります。例えば、Windowsでは警告メッセージが表示されることがあります。その場合は、 詳細情報 を選択してから とにかく実行 を選択します。画面上の指示に従って、Raspberry Pi Imagerのインストールを完了します。

    _images/os_info.png
  3. SDカードをコンピュータまたはラップトップのSDカードスロットに挿入します。

  4. Raspberry Pi Imagerアプリケーションをクリックするか、ターミナルで rpi-imager と入力して起動します。

    _images/os_open_imager.png
  5. CHOOSE DEVICE をクリックして、リストから特定のRaspberry Piモデルを選択します(注:Raspberry Pi 5は適用されません)。

    _images/os_choose_device.png
  6. CHOOSE OS を選択し、 Raspberry Pi OS (Legacy) を選びます。

    警告

    • スピーカーが動作しないため、 Bookworm バージョンはインストールしないでください。

    • Debian Bullseye バージョンの Raspberry Pi OS (Legacy) をインストールする必要があります。

      _images/os_choose_os.png
  7. Choose Storage をクリックして、インストールに適したストレージデバイスを選択します。

    注釈

    正しいストレージデバイスを選択してください。混乱を避けるために、複数のストレージデバイスが接続されている場合は、追加のデバイスを切断してください。

    _images/os_choose_sd.png
  8. NEXT をクリックし、 EDIT SETTINGS をクリックしてOSの設定をカスタマイズします。Raspberry Pi用のモニターがある場合は、次のステップをスキップして「Yes」をクリックしてインストールを開始します。他の設定は後でモニター上で調整します。

    _images/os_enter_setting.png
  9. Raspberry Piの ホスト名 を定義します。

    注釈

    ホスト名はRaspberry Piのネットワーク識別子です。 <hostname>.local または <hostname>.lan を使用してPiにアクセスできます。

    _images/os_set_hostname.png
  10. Raspberry Piの管理者アカウント用に ユーザー名パスワード を作成します。

    注釈

    デフォルトパスワードがないため、独自のユーザー名とパスワードを設定することがRaspberry Piのセキュリティにとって重要です。

    _images/os_set_username.png
  11. ワイヤレスLANを設定し、ネットワークの SSIDパスワード を入力します。

    注釈

    Wireless LAN country を、お住まいの場所に対応する2文字の ISO/IEC alpha2コード に設定してください。

    _images/os_set_wifi.png
  12. SERVICES をクリックし、安全なパスワードベースのリモートアクセスのために SSH を有効にします。設定を保存することを忘れないでください。

    _images/os_enable_ssh.png
  13. Yes をクリックして選択した設定を確認します。

    _images/os_click_yes.png
  14. SDカードに既存のデータがある場合は、データ損失を防ぐためにバックアップしてください。バックアップが不要な場合は、「Yes」をクリックして進行します。

    _images/os_continue.png
  15. OSのインストールプロセスがSDカード上で開始されます。完了時に確認ダイアログが表示されます。

    _images/os_finish.png
  16. Raspberry Pi OSがセットアップされたSDカードを、Raspberry Piの裏側にあるmicroSDカードスロットに挿入します。

    _images/insert_sd_card.png

3. Raspberry Piへの電源供給(重要)

充電

バッテリーケーブルを挿入してください。次に、バッテリーを充電するためにUSB-Cケーブルを挿入します。 充電器はご自身で用意する必要があります。5V 3Aの充電器をお勧めしますが、お使いのスマートフォンの充電器でも問題ありません。

_images/BTR_IMG_1096.png

注釈

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

電源ON

電源スイッチをオンにしてください。電源インジケーターライトとバッテリーレベルインジケーターライトが点灯します。

_images/BTR_IMG_1097.png

数秒待ってから、軽いビープ音が聞こえるはずです。これはラズベリーパイが正常に起動したことを示しています。

注釈

バッテリーレベルインジケーターライトが両方ともオフの場合は、バッテリーを充電してください。 長時間のプログラミングやデバッグが必要な場合は、USB-Cケーブルを挿入してバッテリーを同時に充電し、ラズベリーパイを稼働させることができます。

18650 バッテリー
_images/3pin_battery.jpg
  • 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ケーブル

  • 画面

  • マウス

  • キーボード

手順

  1. マウスとキーボードをRaspberry Piに接続します。

  2. HDMIケーブルを使用して、画面をRaspberry PiのHDMIポートに接続します。画面が電源に接続され、オンになっていることを確認します。

  3. 電源アダプターを使用してRaspberry Piに電源を供給します。数秒後にRaspberry Pi OSのデスクトップが画面に表示されるはずです。

    _images/bullseye_desktop.png
画面がない場合の設定

モニターがない場合は、リモートログインが適切なオプションです。

必要なコンポーネント

  • 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の認証性を確認するセキュリティプロンプトが表示されます。

  1. Raspberry Piに接続するには、次のSSHコマンドを入力します:

    ssh pi@raspberrypi.local
    
    _images/mac_vnc14.png
  2. 初めてログインする際にセキュリティメッセージが表示されます。 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])?
    
  3. 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へのリモートログインが可能です:

  1. Windowsの検索ボックスで powershell と入力します。 Windows PowerShell を右クリックし、 管理者として実行 を選択します。

    _images/powershell_ssh1.png
  2. PowerShellで ping -4 <hostname>.local と入力して、Raspberry PiのIPアドレスを確認します。

    ping -4 raspberrypi.local
    
    _images/sp221221_145225.png

    Raspberry Piがネットワークに接続されている場合、IPアドレスが表示されます。

    • ターミナルに Ping request could not find host pi.local. Please check the name and try again. と表示された場合、入力したホスト名が正しいか確認してください。

    • IPアドレスがまだ取得できない場合は、Raspberry PiのネットワークまたはWiFi設定を確認してください。

  3. 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 に記載されているサードパーティツールを使用する必要があります。

  4. 初めてログインする際にセキュリティメッセージが表示されます。 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])?
    
  5. 以前に設定したパスワードを入力します。セキュリティ上の理由から、パスワードの文字は画面に表示されません。

    注釈

    パスワードを入力する際に文字が表示されないのは正常です。正しいパスワードを入力してください。

  6. 接続が完了すると、Raspberry Piはリモート操作の準備が整います。

    _images/sp221221_140628.png
Linux/Unixユーザー向け
  1. Linux/Unixシステムで**ターミナル**を探して開きます。

  2. 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設定を調べてください。

  3. ssh <username>@<hostname>.local または ssh <username>@<IP address> と入力してSSH接続を開始します。例えば:

    ssh pi@raspberrypi.local
    
  4. 初めてログインする際、セキュリティメッセージが表示されます。「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])?
    
  5. 以前に設定したパスワードを入力します。セキュリティ上の理由から、入力中にパスワードが表示されないことに注意してください。

    注釈

    パスワードの文字がターミナルに表示されないのは正常です。正しいパスワードを入力するようにしてください。

  6. 正常にログインできたら、Raspberry Piは接続され、次のステップに進む準備が整いました。

Raspberry Piのリモートデスクトップアクセス

コマンドラインアクセスよりもグラフィカルユーザーインターフェース(GUI)を好む方のために、Raspberry Piはリモートデスクトップ機能をサポートしています。このガイドでは、リモートアクセス用のVNC(Virtual Network Computing)の設定と使用方法を説明します。

この目的のために VNC® Viewer の使用を推奨します。

Raspberry PiでVNCサービスを有効にする

VNCサービスはRaspberry Pi OSにプリインストールされていますが、デフォルトでは無効になっています。次の手順に従って有効にしてください:

  1. Raspberry Piのターミナルで次のコマンドを入力します:

    sudo raspi-config
    
  2. 下矢印キーを使用して Interfacing Options に移動し、 Enter キーを押します。

    _images/config_interface.png
  3. オプションから VNC を選択します。

    _images/vnc.png
  4. 矢印キーを使用して <Yes> -> <OK> -> <Finish> を選択し、VNCサービスの有効化を完了します。

    _images/vnc_yes.png

VNC Viewerを使用してログインする

  1. 個人用コンピューターに VNC Viewer をダウンロードしてインストールします。

  2. インストール後、VNC Viewerを起動します。Raspberry Piのホスト名またはIPアドレスを入力し、Enterキーを押します。

    _images/vnc_viewer1.png
  3. プロンプトが表示されたら、Raspberry Piのユーザー名とパスワードを入力し、 OK をクリックします。

    _images/vnc_viewer2.png
  4. これで、Raspberry Piのデスクトップインターフェースにアクセスできます。

    _images/bullseye_desktop.png

5. すべてのモジュールをインストールする(重要)

  1. システムを更新します。

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

    sudo apt update
    sudo apt upgrade
    

    注釈

    LiteバージョンのOSをインストールする場合は、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
    
  3. vilib モジュールをインストールします。

    cd ~/
    git clone -b picamera2 https://github.com/sunfounder/vilib.git
    cd vilib
    sudo python3 install.py
    
  4. コードをダウンロードします。

    cd ~/
    git clone https://github.com/sunfounder/pidog.git
    
  5. pidog モジュールをインストールします。

    cd pidog
    sudo python3 setup.py install
    

    このステップには少し時間がかかるので、気長にお待ちください。

  6. スクリプト i2samp.sh を実行します。

    最後に、i2sアンプに必要なコンポーネントをインストールするためのスクリプト i2samp.sh を実行する必要があります。そうしないと、ロボットに音が出ません。

    cd ~/pidog
    sudo bash i2samp.sh
    
    _images/i2s.png

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

    _images/i2s2.png

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

    _images/i2s3.png

    y と入力し、 Enter を押してマシンを再起動します。

    注釈

    再起動後に音が出ない場合は、 i2samp.sh スクリプトを複数回実行する必要があるかもしれません。

6. I2CおよびSPIインターフェースの確認

Raspberry PiのI2CおよびSPIインターフェースを使用します。これらのインターフェースは、以前に robot-hat モジュールをインストールする際に有効にされているはずです。すべてが順調であることを確認するために、実際に有効になっているかどうかを確認しましょう。

  1. 次のコマンドを入力します:

    sudo raspi-config
    
  2. キーボードの下矢印キーで Interfacing Options を選択し、 Enter キーを押します。

    _images/image282.png
  3. 次に I2C を選択します。

    _images/image283.png
  4. キーボードの矢印キーを使用して、 <Yes> -> <OK> を選択し、I2Cの設定を完了します。

    _images/image284.png
  5. 再度 Interfacing Options に行き、 SPI を選択します。

    _images/image-spi1.png
  6. キーボードの矢印キーを使用して、 <Yes> -> <OK> を選択し、SPIの設定を完了します。

    _images/image-spi2.png

7. サーボの調整(重要)

サーボの角度範囲は-90〜90度ですが、工場で設定された角度はランダムで、0°かもしれないし、45°かもしれません。このような角度で直接組み立てると、ロボットがコードを実行した後に混乱状態になったり、最悪の場合、サーボがブロックして焼き切れる原因になります。

したがって、ここではすべてのサーボの角度を0°に設定してから取り付ける必要があります。これにより、サーボの角度が中央にあり、どの方向に回転しても問題ありません。

  1. サーボが正しく0°に設定されていることを確認するために、まずサーボアームをサーボ軸に挿入し、ロッカーアームを優しく異なる角度に回転させます。このサーボアームは、サーボが回転していることを明確に確認するためのものです。

    _images/servo_arm.png
  2. それでは、 examples/ フォルダ内の servo_zeroing.py を実行します。

    cd ~/pidog/examples
    sudo python3 servo_zeroing.py
    

    注釈

    エラーが発生した場合は、Raspberry PiのI2Cポートを再度有効にしてみてください。詳細は 6. I2CおよびSPIインターフェースの確認 を参照。

  3. 次に、以下のようにサーボケーブルをP11ポートに接続します。同時に、サーボアームが位置に回転するのが見えます(これが0°の位置で、ランダムな位置であり、垂直または平行でない場合があります)。

    _images/servo_pin11.jpg
  4. 今度はサーボアームを取り外し、サーボワイヤーが接続されたままにし、電源を切らないでください。その後、紙の指示に従って組み立てを続けます。

注釈

  • サーボスクリューで固定する前に、このサーボケーブルを抜かないでください。固定した後に抜くことができます。

  • 電源が入っている状態でサーボを回転させないでください。これにより損傷を防ぐことができます。サーボ軸が正しい角度で挿入されていない場合は、サーボを取り出して再挿入してください。

  • 各サーボを組み立てる前に、PWMピンにサーボケーブルを接続し、電源を入れて0°に設定する必要があります。

ビデオ

私たちの組み立てビデオの 3:40から7:23 まで、この章の詳細なチュートリアルがあります。直接ビデオの指示に従うことができます。

組み立てが完了したら、組み立てにわずかなずれがある場合にサーボが損傷するのを防ぐために、PiDogをキャリブレーションする必要があります。

2. PiDogのキャリブレーション

イントロダクション

PiDogをキャリブレーションすることは、安定して効率的に動作させるために不可欠なステップです。このプロセスは、組み立て中や構造上の問題から生じる可能性のある不均衡や不正確さを修正するのに役立ちます。PiDogがしっかりと歩き、期待通りに動作するように、これらの手順に注意深く従ってください。

しかし、偏差角が大きすぎる場合は、 7. サーボの調整(重要) に戻ってサーボの角度を0°に設定し、その後の指示に従ってPiDogを再組み立てる必要があります。

キャリブレーションビデオ

包括的なガイドについては、完全なキャリブレーションビデオを参照してください。これには、PiDogを正確にキャリブレーションするための視覚的なステップバイステッププロセスが含まれています。

手順

具体的な手順は以下の通りです:

  1. PiDogをベースに置きます。

    _images/place-pidog.JPG
  2. PiDogのexamplesディレクトリに移動し、 0_calibration.py スクリプトを実行します。

    cd ~/pidog/examples
    sudo python3 0_calibration.py
    

    スクリプトを実行すると、ターミナルにユーザーインターフェースが表示されます。

    _images/calibration_1.png
  3. 提供された画像に示されているように、 キャリブレーションルーラー (アクリルC)を配置します。ターミナルで 1 を押し、続いて ws キーを使って画像に示されているように端を揃えます。

    _images/CALI-1.2.png
  4. 次の画像に示されたように、 キャリブレーションルーラー (アクリルC)を再配置します。ターミナルで 2 を押し、続いて ws を使って端を揃えます。

    _images/CALI-2.2.png
  1. 残りのサーボ(3〜8)に対してキャリブレーションプロセスを繰り返します。PiDogの4本の脚すべてがキャリブレーションされていることを確認してください。

また、PiDogで以下のプロジェクト効果を実現することもできます。

3. 楽しいPythonプロジェクト

ここでは、PiDogの多様性と能力を示すエキサイティングなプロジェクトのコレクションに深く潜り込みます。 1. 起床 の起床ルーチンの基本設定から、 13. ボール追跡 のボール追跡の高度なダイナミクスまで、各プロジェクトはロボット工学のPythonプログラミングの世界へのユニークな洞察を提供します。PiDogにエリアをパトロールさせたり、コマンドに反応させたり、腕立て伏せを実行させたり、命令で遠吠えさせたりすることに興味がある場合、あなた向けのプロジェクトがあります。さらに、PiDogの能力をコンピュータインターフェースに拡張したい人向けに、キーボードやアプリ制御のチュートリアルもあります。飛び込んで、これらの実践的なPythonプロジェクトでPiDogと共に発見と楽しみの旅を始めましょう!

1. 起床

これはPiDogの最初のプロジェクトです。PiDogを深い眠りから目覚めさせます。

_images/py_wakeup.gif

コードの実行

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に動作や音を出させることができます。

現在この例に含まれている動作/音響効果は以下の通りです。

_images/py_2.gif

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は前方に進みますが、前方に障害物がある場合は停止して吠えます。

_images/py_3.gif

コードの実行

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の頭をつかむと、警戒して吠えます。

_images/py_4-2.gif

しかし、後ろから手を伸ばして頭をなでると、とても楽しむでしょう。

コードの実行

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は地面でうとうとし、周りの音を聞くと混乱して立ち上がり、誰が自分を起こしたのかを見ます。

_images/py_5.gif

コードの実行

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は飛べると感じ、スーパーマンのポーズで歓声をあげます。

_images/py_6.gif

コードの実行

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は運動好きなロボットで、あなたと一緒に腕立て伏せをします。

_images/py_8.gif

コードの実行

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はかわいい子犬だけでなく、勇ましい犬でもあります。遠吠えを聞いてみましょう!

_images/py_9.gif

コードの実行

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は緩やかな斜面でスムーズに歩くことができます。

_images/py_10.gif

コードの実行

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を操作する
  1. APP Store(iOS) または Google Play(Android) から SunFounder Controller をインストールします。

  2. sunfounder-controller モジュールをインストールします。

    最初に robot-hatvilibpicar-x モジュールをインストールする必要があります。詳細は 5. すべてのモジュールをインストールする(重要) を参照してください。

    cd ~
    git clone https://github.com/sunfounder/sunfounder-controller.git
    cd ~/sunfounder-controller
    sudo python3 setup.py install
    
  3. コードを実行します。

    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)
    
  4. PiDogSunfounder Controller を接続します。

    • タブレット/携帯電話をPiDogがあるWLANに接続します。

    • Sunfounder Controller アプリを開き、+アイコンをクリックしてコントローラーを追加します。

      _images/app1.png
    • 一部の製品にはプリセットコントローラーが用意されており、ここでは PiDog を選択します。名前を入力するか、そのまま 確認 をタップします。

      _images/app_preset.jpg
    • 中に入ると、アプリが自動的に Mydog を検索します。しばらくすると、「接続成功」というプロンプトが表示されます。

      _images/app_auto_connect.jpg

    注釈

    • 手動で app_connect ボタンをクリックすることもできます。数秒待ってから、MyDog(IP)が表示されたらクリックして接続します。

      _images/sc_mydog.jpg
  5. コントローラーを実行します。

    • 「接続成功」というプロンプトが表示されたら、右上隅の▶ボタンをタップします。

    • カメラが撮影した画像がアプリに表示され、これらのウィジェットでPiDogを操作できます。

      _images/sc_run.jpg

ウィジェットの機能は以下の通りです。

  • 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に直接接続し、ロボット犬を簡単に制御できます。

どのように設定するか?

  1. 以下のコマンドを実行して、 pidog_app アプリケーションをインストールおよび設定し、PiDogのWiFiを設定します。

    cd ~/pidog/bin
    sudo bash pidog_app_install.sh
    
  2. 最後に「y」と入力してPiDogを再起動します。

    _images/auto_start.png
  3. それ以降は、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は、以下に示すようないくつかの方法でインスタンス化する必要があります。

  1. 初期化の最も単純なステップは以下の通りです。

# Pidogクラスをインポート
from pidog import Pidog

# PiDogのインスタンスを作成
my_dog = Pidog()
  1. 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 )を制御するために専用です。

  1. 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: 角度グループの実行速度。

いくつかの一般的な使用方法を以下に示します:

  1. 即座に行動をとる。

from pidog import Pidog
import time

my_dog = Pidog()

# 半立ち
my_dog.legs_move([[45, 10, -45, -10, 45, 10, -45, -10]], speed=50)
  1. 実行キューにいくつかの角度グループを追加する。

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)
  1. 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()

バッファ内の足のすべての頭部アクションをクリアし、頭部サーボを停止させます

以下は一般的な使用例です

  1. 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)
  1. 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)
  1. 座っているか半立ちしているかにかかわらず、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()

バッファ内の足のすべての尾のアクションをクリアし、尾サーボを停止させます

以下は一般的な使用例です

  1. 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: アクションを実行する速度。

使用例を以下に示します

  1. 腕立て伏せを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軸モジュールの使用例をいくつか紹介します

  1. リアルタイムの加速度、角速度を読み取る

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()
  1. 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()
  1. 傾いている間、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ライブラリ

    Vilibは、Raspberry Piカメラ用にSunFounderが開発したライブラリです。

    写真撮影、ビデオ録画、ポーズ検出、顔検出、動き検出、画像分類など、実用的な機能が含まれています。

  • 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とボタンもあります。

_images/O1902V40RobotHAT.png
電源ポート
  • 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オーディオチャンバースピーカーとともにモノサウンド出力を提供します。

カメラモジュール

説明

_images/camera_module_pic.png

これは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ワイヤが正しく取り付けられている場合、引っ張るとまっすぐで取り出されなくなります。そうでない場合は、再度取り付けてください。

_images/connect_ffc.png _images/1.10_camera.png

警告

電源を入れた状態でカメラを取り付けないでください。それはカメラを壊す可能性があります。

サウンド方向センサー

_images/cpn_sound.png

これはサウンド方向認識モジュールです。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

_images/cpn_imu.png

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

デュアルタッチセンサー

_images/cpn_touchswitch.png

2つのttp223タッチセンサーをベースにしたデュアルチャンネルタッチセンサーです。 タッチ信号が検出されると、対応するピンレベルが低くなります。

TTP223は、1つのタッチキーを提供するタッチパッド検出ICです。 このタッチ検出ICは、異なるパッドサイズの従来の直接キーを置き換えるために特別に設計されています。 低消費電力と広い動作電圧が特徴です。

仕様

  • 電源供給:2.0V〜5.5V

  • シグナル出力:デジタル信号

  • コネクタ:SH1.0 4P

ピン配置

  • GND - グラウンド入力

  • VCC - 電源供給入力

  • SIG1 - タッチシグナル1、低レベルはタッチを意味します

  • SIG2 - タッチシグナル2、低レベルはタッチを意味します

11チャンネルライトボード

_images/cpn_lightboard.png

これは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

超音波モジュール

_images/ultrasonic_pic.png
  • 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

    _images/ultrasonic_prin.jpg

公式:

  • us / 58 = センチメートル距離

  • us / 148 = インチ距離

  • 距離 = 高レベル時間 x 速度(340M/S) / 2

アプリケーションノート

  • このモジュールは電源投入時に接続されるべきではありません。必要な場合は、モジュールのGNDを最初に接続してください。そうしないと、モジュールの動作に影響を与えます。

  • 測定対象の面積は少なくとも0.5平方メートルで、できるだけ平らでなければなりません。そうでないと、結果に影響します。

18650 バッテリー

_images/2battery.jpg
  • 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ソフトウェア

_images/filezilla_icon.png

ファイル転送プロトコル(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 キーを押してサーバーに接続します。

_images/filezilla_connect.png

注釈

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

_images/ftp_site.png

ステップ3: ファイルのアップロード/ダウンロード

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

_images/upload_ftp.png

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 が事前にインストールされていないことを意味します。以下のチュートリアルに従って、手動でインストールする必要があります。

  1. Windowsデスクトップの検索ボックスに powershell と入力し、 Windows PowerShell を右クリックし、表示されるメニューから 管理者として実行 を選択します。

    _images/powershell_ssh.png
  2. 以下のコマンドを使用して OpenSSH.Client をインストールします。

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
    
  3. インストール後、以下の出力が返されます。

    Path          :
    Online        : True
    RestartNeeded : False
    
  4. 次のコマンドを使用してインストールを確認します。

    Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
    
  5. これにより、 OpenSSH.Client が正常にインストールされたことがわかります。

    Name  : OpenSSH.Client~~~~0.0.1.0
    State : Installed
    
    Name  : OpenSSH.Server~~~~0.0.1.0
    State : NotPresent
    

    警告

    上記のプロンプトが表示されない場合、Windowsシステムがまだ古い可能性があり、 PuTTY のようなサードパーティのSSHツールをインストールすることをお勧めします。

  6. 今、PowerShellを再起動し、管理者として実行し続けます。この時点で、 ssh コマンドを使用してRaspberry Piにログインできるようになり、以前に設定したパスワードを入力するように求められます。

    _images/powershell_login.png

PuTTY

Windowsユーザーの場合、SSHのいくつかのアプリケーションを使用できます。ここでは、 PuTTY をお勧めします。

ステップ 1

PuTTYをダウンロードします。

ステップ 2

PuTTYを開き、左側のツリー構造の セッション をクリックします。 ホスト名(またはIPアドレス) のテキストボックスにRPiのIPアドレスを入力し、 ポート の下に 22 を入力します(デフォルトでは22です)。

_images/image25.png

ステップ 3

Open をクリックします。Raspberry Piに初めてログインすると、セキュリティの警告が表示されます。 はい をクリックしてください。

ステップ 4

PuTTYウィンドウが login as: とプロンプトを表示した場合、 pi (RPiのユーザー名)と パスワード raspberry (デフォルトのパスワード、変更していない場合)を入力します。

注釈

パスワードを入力すると、文字がウィンドウに表示されないのは正常です。必要なのは正しいパスワードを入力することです。

PuTTYの横に inactive と表示された場合、接続が切断されたことを意味し、再接続する必要があります。

_images/image26.png

ステップ 5

ここで、Raspberry Piに接続され、次のステップを実行する時間です。

著作権に関するお知らせ

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