【解決策】Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontendの対処法 Ubuntu 20.04 on Raspberry Pi 4
Ubuntu OS 上でシステムのアップデートをする際にいつも通りsudo apt upgradeを実行したところ
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend
のエラーが表示された.今回はその解決策について取り上げる.
まずは下記3つのコマンドを実行する.
sudo rm /var/lib/apt/lists/lock
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
実行後に再度sudo apt upgradeしたところ以下のエラーが表示されました.
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct problem
システムがパッケージのインストールや更新中に問題が発生し,未完了のパッケージが存在する場合に,再度パッケージの設定を試みることができるようです.
sudo dpkg --configure -a
上記のコマンドを実行した後に,以下のエラーが表示されました.
これは,/var/cache/apt/archives/ディレクトリにロックファイルがあるためにAPT(Advanced Package Tool)パッケージマネージャーが正常に動作できないことを意味しているようです.
E: Could not get lock /var/cache/apt/archives/lock. It is held by process 17672 (aptd)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/cache/apt/archives/く
上記の問題を解決するために,下記のコマンドを実行します.このコマンドはAPT(Advanced Package Tool)パッケージマネージャーが使用中にパッケージの操作が中断され,APTがロックファイルを生成してしまった場合に,手動でロックファイルを削除します.
sudo rm /var/cache/apt/archives/lock
以上のコマンドを実行することで無事にupgradeをすることができました.
M5StackとUiFlowを使って DJI Telloドローンを制御する
- 取り組み内容
- Telloとは
- M5Stackとは
- UiFlowとは
- iPhoneによるドローン操縦
- iPhoneアプリによるドローンの様子
- M5Stackによるドローン制御
- UiFlowを用いたドローン制御のアルゴリズム
- UiFlowプログラムの実行結果
- まとめ
取り組み内容
今回はM5StackとM5製品に特化したビジュアルプログラミング環境である「UiFlow」を用いてDJIが販売している「Telloドローン」を制御する.今回ドローンをUiFlowで制御する背景としては,UiFlowにTello専用の動作ブロックがあったため実際に使えるか試したい.
Telloとは
今回フライト制御するドローンはDJIが販売している「Telloドローン」です.15000円前後で購入できる比較的安価で小型であることが特徴です.飛行重量80gのためドローン登録義務化の対象外となります.
M5Stackとは
M5Stackは液晶,スピーカー,ボタンを搭載したマイコンベースの開発ボードです.M5Stack専用のモジュールやセンサを組み合わせて利用することができます.
UiFlowを利用するための環境構築は以前のブログで書かれているので参考にしてみてください.
M5 Gray
UiFlowとは
UiFlowの使い方については後日取り上げるが,M5製品に特化したプログラミング環境である.センサやモジュールごとにブロックが用意されており,ブロックを組み合わえうことでセンサなど動作確認を容易に行うことができるのが利点である.
iPhoneによるドローン操縦
M5Stackを用いてドローンを制御するにあたって,iPhoneのTello操縦アプリによるドローンの動作確認を行います.
※アプリでの動作確認野前にM5Stackで動作確認したところ全く通信できませんでした.
- まずはApp Storeから「Tello」と検索してアプリをダウンロードしてください.
- ドローンの個体番号を確認します.この個体番号はiPhoneやM5Stackとドローンが通信する際に使用します.
- 個体番号を確認したらドローン用のバッテリーをドローンに挿入します.
- バッテリーを挿入した後にドローンの右側にあるボタンを1回押して電源を入れます.※カメラの横にあるランプが黄色に点滅するまで待つ
- 次にiPhoneからドローンへ接続します.設定アプリをタップしiPhoneの設定画面からWi-Fiを開きます.そしてWi-Fiのネットワークからドローンの固体番号が書かれたネットワークを選択します.
- 次にTelloアプリをタップして起動します.Telloアプリを起動したら「ドローンを接続」を選択します.
- 接続が成功すると,ドローンのカメラ映像がリアルタイムに見ることができます.ドローンのコントローラーの各ボタンは以下のように構成されています.
ボタンを押している間はドローンは動き続け,手を離すと停止します.
iPhoneアプリによるドローンの様子
以下の動画でiPhoneのアプリを使ったドローンの様子とアプリの操作感覚を見ることができます.
M5Stackによるドローン制御
iPhoneのアプリによるドローンの動作確認ができたため,今回の目的であるM5Stackによるドローン制御を行っていきます.
大まかな手順として,まずPC上でドローンの制御用プログラムを作成します.そしてそのプログラムをM5Stackに送信し,プログラムを実行することでドローンを制御します.
UiFlowによるドローン制御プログラムの作成
今回はブラウザ版のUiFlowを使ってプログラムを作成します.
- 上記のリンクを開くと下記の画面が表示されます.使用するM5製品に応じたUiflowのバージョンを選択し「Confirm」をクリックします.
- 画面やや左側にある色分けされたブロックのパネルを下にスクロールすると下から三番目に黄色の「Third Party」があります.それをクリックすると下に「Tello」のブロックパネルが見え,ドローンを操縦するためのブロックを選択できるようになります.
- 各ブロックの機能は以下の通りです.これらのブロックを組み合わせてドローンを制御します.
UiFlowを用いたドローン制御のアルゴリズム
下記の図はUiFlowでドローンを制御するためのプログラムです.プログラムの想定動作はM5StackとTelloが接続出来たら離陸し,ドローンの動作をM5Stackのボタンによって決定します.
アルゴリズムの概要
- ドローンの初期化
- M5StackとドローンをWi-Fi経由で接続する.
- もしWi-Fiが接続されたら,ドローンを接続する.
- ドローンを離陸する
- M5StackのボタンAを押すとドローンを時計回りに旋回させる.
- M5StackのボタンCを押すとドローンを着陸させる.
- 着陸した後に自宅のWi-Fiに接続する
※手順7を実行しないと次回使用する際にTelloのWi-Fiに接続されてしまうため
実行前の注意事項
実行ボタンを押すと「You need to download the tello.py file!」と表示されるのでTello.pyをダウンロードします.
再度実行ボタンを押すとプログラムがM5Stackに送信されます.
UiFlowプログラムの実行結果
UiFlowで書いたプログラムをM5Stackで実行することでTelloドローンを制御することができた.
まとめ
今後はM5Stack内蔵してあるIMUによる傾きに応じてドローンの前後・左右方向に移動させるなどして応用していきたいと思います.
M5Stackの環境構築【M5Burner v3編】
概要
久しぶりにM5Stack関連のデバイスを触ろうとしたところ,M5Burner等のソフトウェアが大きく更新されていたので備忘録を作成する.
M5Stackとは
M5Stackとは,Arduino とは異なり液晶,スピーカー,ボタンを搭載したマイコンベースの開発ボードである.M5Stack専用のモジュールやセンサを組み合わせて利用することができます.Wi-FiとBluetoothの無線通信機能,デジタル入出力ピン,アナログ入力ピンなどの多様なハードウェアインタフェースを備えている.さらにArduino IDEとの互換性やUiFlowを用いたビジュアルプログラミングなども可能である.
M5Burnerとは,M5Burnerとは,M5Burnerは,M5Stackデバイス(M5StackやM5StickCなど)をプログラムやファームウェアを書き込むためのツールです.M5Burnerを使用することで,M5Stackデバイスに必要なソフトウェアやファームウェアを簡単に書き込むことができます.
M5Burnerインストールの事前準備
M5BurnerをインストールしてM5Stackを利用するにはUSBシリアルドライバをあらかじめダウンロードしておく必要があります.USBシリアルドライバとは,USBポートとデバイス内のシリアル通信ポートとの間でデータの受け渡しを行うソフトウェアプログラムである.
M5Burner v3の使いかたによれば,使用するM5StackのデバイスによってダウンロードするUSBシリアルドライバの種類が異なる.今回はWindows PCでM5Stack Grayを利用する想定なのでCP210x_VCP_Windowsをダウンロードする.
⇓USBシリアルドライバのダウンロードURL⇓
又は下記のURLからダウンロードできる.
URLをクリックすると,左側にあるバーに「USB Driver」をクリックする.そして,利用するM5製品とPCのOSに合わせてUSBシリアルドライバをダウンロードする.
ダウンロードした「CP210x_VCP_Windows.zip」を解凍する.そして使用しているPCに応じてインストーラを起動する(今回はWindows 64bitなので CP210xVCPInstaller_x64_v6.7.0.0.exeを起動する)
インストーラを起動するとCP210xのインストール画面に移るので,[次へ]をクリックしてください.
次にシリアルドライバの使用許諾契約の同意に関する画面に切り替わります.問題がなければ位「同意します」をクリックした後に「次へ」をクリックしてください.
ここまで進むとシリアルドライバのソフトウェアのインストールに進むことが出来ます.
以上でM5Burnerインストール前の事前準備になります.次にM5Burnerのインストールに進んでいきます.
M5Burnerのインストール
先ほどシリアルドライバをダウンロードした同じページからM5Burnerをダウンロードします.
左側のバーにある「M5BURNER」から使用しているPCのOSに応じてM5Burnerをダウンロードします.
ダウンロードした「M5Burner-v3-beta-win-x64.zip」を解凍して,「M5Burner.exe」をクリックしてインストーラを起動する.
インストーラを起動すると,下記の画面が表示されるので「詳細情報」をクリックする.
「詳細情報」をクリックすると右下に「実行」ボタンが表示されるのでクリックする.
「実行」ボタンをクリックすると,M5Burnerが無事に起動することができる.
M5Burnerをインストールすることができました.
まとめ
以上のように順を追って進めるとM5Burnerをインストールができます.
時間があるときにUiflowの使い方をまとめたいと思います.
Raspberry Pi 4+Ubuntu 20.04でFritzingをインストールする
概要
普段使用しているRaspberry Pi4(Ubuntu 20.04の環境)でfritzingをインストールする
Fritzingとは
Fritzingは電子回路の設計,プロトタイピング,教育目的での使用を容易にするためのオープンソースのソフトウェアです.路図,ブレッドボード,基板レイアウトの3つの視点で電子回路を設計できる直感的なインターフェースを提供しています.
インストール環境
- Raspberry Pi 4
- Ubuntu OS 20.04
インストール方法
Raspberry Pi(Ubuntu 20.04)でFritzingをインストールするには以下のコマンドを実行します.
sudo apt-get update
sudo apt-get -y install fritzing
Fritzingの起動方法
Raspberry Pi上にfritzingをインストールして,起動するには「kicad」とターミナル上に入力する必要があります.
fritzing
コマンドの実行結果
Raspberry PiでFritzingを起動すると以下に示すようなウィンドウが表示されました.
まとめ
Raspberry Pi4上でKiCadをインストールすることができたので,今度ははFritzingを使って回路図を作成したいと思います.
Raspberry Pi 4+Ubuntu 20.04でKiCadをインストールする
概要
普段使用しているRaspberry Pi4(Ubuntu 20.04の環境)でKiCadをインストールする
KiCadとは
KiCadは,電子部品のシンボルやフットプリント(レイアウト)を作成し,それらを使って回路図や基板レイアウトを作成するためのツールセットを提供しています.
インストール環境
- Raspberry Pi 4
- Ubuntu OS 20.04
インストール方法
Raspberry Pi(Ubuntu 20.04)でKiCadをインストールするには以下のコマンドを実行します.
sudo apt install -y kicad
KiCadの起動方法
Raspberry Pi上にKiCadをインストールして,起動するには「kicad」とターミナル上に入力する必要があります.
kicad
コマンドの実行結果
Raspberry PiでKiCadを起動すると以下に示すようなウィンドウが表示されました.
まとめ
Raspberry Pi4上でKiCadをインストールすることができたので,今度は試しに基盤を作ってみたいと思います.
Raspberry Pi4+Ubuntu 20.04+ GPIOでサーボモータSG90を制御する方法【Python】
- 使用したもの
- Raspberry Pi(ラズベリーパイ)とは
- Ubuntu OS とは
- Ubuntu OS上でGPIOライブラリのインストール
- PWMとは
- SG90
- 作成したソースコード
- 実行結果
- まとめ
使用したもの
-
サーボモータ SG90
- Raspberry Pi 4( Ubuntu OS 22.04)
Raspberry Pi(ラズベリーパイ)とは
Raspberry Pi(ラズベリーパイ)は,小型のシングルボードコンピュータです.このデバイスは,主に教育やホビープロジェクト,組み込みシステムなどで使用されます.Raspberry Pi Foundation(ラズベリーパイ財団)が,基本的なコンピュータサイエンスの教育や発展途上国での普及を促進するために開発しました.コンパクトなサイズにもかかわらず,Raspberry Piにはさまざまなポートや接続オプションが備わっています.USBポート,HDMI出力,Ethernet,Wi-Fi,Bluetoothなどが利用できます.
Ubuntu OS とは
Ubuntuは,Linuxディストリビューションの一つであり,DebianベースのOSです.オープンソースのプロジェクトであり,無料で入手できます.
今回ROSを利用してロボットを制御することを想定しているため,Raspberry PiにUbuntu OSをインストールした状態でGPIOが使えるように環境構築を行います.今回はRaspberry Pi4にUbuntu 20.04をインストールしている前提で進めていきます.
以前はRaspberry pi OSでRPi.GPIOを使用していたのですが,その時はデフォルトでインストールされていたため,今回初めてubuntuでGPIOが使用できるのに苦労しました.
Ubuntu OS上でGPIOライブラリのインストール
Ubuntu OSでRaspberry Pi OSと同様にGPIOライブラリをインストールしてみました.ただ,一筋縄ではいかなかったので以下のサイトを参考にしてインストールしました.
Installation of RPI.GPIO failure on Pi4 running Ubuntu 20.10 Desktop - Raspberry Pi Forums
まずはPythonのパッケージ管理ツールであるpipとPythonの開発ヘッダーファイルをインストールします.Pythonパッケージの追加インストールやビルドに必要な依存関係を解決するために使用されます.
sudo apt-get install python3-pip python-dev
下記のコマンドは,Pythonパッケージ管理ツールであるpipを使用して,Raspberry PiのGPIOを制御するためのPythonライブラリであるRPi.GPIOをインストールします.
pip3 install RPi.GPIO
下記のコマンドは,Cコンパイラに対して-fcommonオプションを設定します.これは一部のCコードが共有変数のエラーを回避するために必要なフラグです.(参考文献ではこのコマンドを実行していましたが,いまいちどのようなコマンドか理解できていないです.)
export CFLAGS=-fcommon
下記のコマンドは,/dev/gpio*というパスにマッチするデバイスファイルのアクセス権を変更します.sudo chmodは,rootユーザーの権限でコマンドを実行することを意味し,og+rwxは,オーナーとグループのユーザーに読み取り,書き込み,実行の権限を与えることを意味します.これにより,GPIOデバイスに対するアクセス権が変更され,ユーザーがGPIOを制御できるようになります.
sudo chmod og+rwx /dev/gpio*
これらのコマンドを順番に実行することで,Pythonのパッケージとライブラリをインストールし,Raspberry PiのGPIOを制御するために必要な設定を行うことができます.
PWMとは
PWMはパルス幅変調(Pulse Width Modulation)の略で,デジタル信号のパルスの幅を変化させることで電気機器への電力を効率よく制御するための一般的な技術です.PWMでは,信号が高レベルと低レベルを高速に切り替わります.信号が高レベルになっている時間の割合(デューティサイクル)によって負荷に供給される電力の量が決まります.デューティサイクルを変化させることで,実際の電圧や電流レベルを変えずに,負荷に供給される有効な電圧や電流を調整することができます.PWMは,モータの速度制御やLEDの明るさ制御など,電力の精密な制御が必要なデバイスの制御によく使用されます.
SG90
今回制御を試みるSG90は安価かつ小型なサーボモータです.制御信号に基づいて0度から180度まで回転することができますArduinoやM5stackなどのマイコンやRaspberrry Piからパルス幅変調(PWM)信号を送ることで制御することができます.5V, GND,制御信号のための3本のワイヤが付属しており,取り付けブラケットやホーンも付属しています.
SG90
Raspberry PiとSG90の配線図
SG90の先端にジャンパーワイヤーを取り付けて,Raspberry Pi4のGPIOに接続します.赤と茶色はそれぞれRaspberry Piの5VとGNDに接続してください.橙色はGPIOの18番(PWMポート)に接続して下さい.
SG90の先端
SG90の配色と機能
Raspberry PiとSG90の配線図
作成したソースコード
import RPi.GPIO as GPIO
import time
# GPIOピン番号の設定
servo_pin = 18
# PWMの周波数とデューティーサイクル範囲の設定
frequency = 50 # 50 Hz
duty_cycle_min = 2.5 # 0度のデューティーサイクル(2.5%)
duty_cycle_max = 12.5 # 180度のデューティーサイクル(12.5%)
# GPIOの初期設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
# PWMのインスタンスを作成
pwm = GPIO.PWM(servo_pin, frequency)
# サーボモータの角度を設定する関数
def set_angle(angle):
duty_cycle = duty_cycle_min + (angle / 180.0) * (duty_cycle_max - duty_cycle_min)
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.3) # 角度に到達するまでの待ち時間
# メインのコード
try:
pwm.start(duty_cycle_min) # 0度から開始
while True:
set_angle(0) # 0度まで回転
time.sleep(1)
set_angle(90) # 90度まで回転
time.sleep(1)
set_angle(180) # 180度まで回転
time.sleep(1)
except KeyboardInterrupt:
# Ctrl+Cで終了した場合,GPIOの設定をクリーンアップ
pwm.stop()
GPIO.cleanup()
実行結果
Ubuntu 20.04 +Raspberry Pi4上でサーボモータSG90を制御することができました.
機会があったらROSでサーボモータを制御する記事を書いてみたいと思います.
まとめ