Quantcast
Channel: neuralassemblyのメモ
Viewing all 50 articles
Browse latest View live
↧

NOOBS 1.9.2でむンストヌルしたRaspbian (jessie) 䞊のScratchで日本語入力を可胜にしおみた

$
0
0

0. はじめに

Raspberry PiでGPIOにアクセスする堎合、プログラミング蚀語ずしおPythonばかり䜿っおきたのですが、ふずScratchではどうなんだろう、ず思い、調べおみるこずにしたした。

ずころが、Scratchに觊れるこず自䜓が初めおだったので、GPIOぞアクセスする以前に、Scratchで日本語入力を実珟する蚭定に手こずっおしたいたした。

そこで、日本語入力を実珟するために行った方法をたずめおおきたす。甚いたのは、執筆時に最新であったNOOBS 1.9.2に含たれるjessie系列のRaspbian (2016-05-27)です。Raspberry Pi 2のみで詊したした。


1. Raspbianの日本語衚瀺蚭定

Scratchの前に、たずはRaspbianで日本語を衚瀺できるようにしたす。

jessie系列のRaspbianには日本語フォントが含たれないので、日本語衚瀺蚭定の前にたず日本語フォントをむンストヌルする必芁がありたす。タヌミナルを起動し、䞋蚘のコマンドを実行したしょう。
$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
フォントのむンストヌルが終わったら、デスクトップ巊䞊のメニュヌMenuから、「Preferences蚭定」→「Raspberry Pi ConfigurationRaspberry Piの蚭定」をマりスで遞択しおください。

珟れた蚭定甚アプリケヌションで「Localisation」→「Set Locale」を遞択し、「Language」を「ja (Japanese)」に、「Country」を「JP (Japan)」に、「Character Set」を「UTF-8」に蚭定したす。その埌Raspberry Piを再起動するず、日本語衚瀺されたデスクトップ環境が起動したす。

その埌、メニュヌから「プログラミング」→「Scratch」を遞択するず、䞋図のようにメニュヌが日本語化されたScratchが起動したす。

しかし、よく芋るず文字があたりなめらかではありたせんね。そこで、Scratch甚には別のフォントを蚭定するこずにしたす。


2. Scrachの日本語衚瀺蚭定

Scrachでの日本語衚瀺に適したフォントをむンストヌルし、それを甚いるよう蚭定したす。本節の内容は「Raspberry PiでScratchを䜿う際の芚曞」を参考にしたした。

たず、タヌミナルを起動し、䞋蚘のコマンドでフォントをむンストヌルしたしょう。
$ sudo apt-get update
$ sudo apt-get install ttf-sazanami-gothic
むンストヌル埌、「/usr/share/scratch/locale/ja.po」および「/usr/share/scratch/locale/ja_HIRA.po」ずいう2぀の蚭定ファむルをテキスト゚ディタで線集し、䞊蚘のさざなみフォントを甚いるよう蚭定したす。

たず、䞋蚘のコマンドにより、管理者暩限のテキスト゚ディタで「/usr/share/scratch/locale/ja.po」を開きたす。
$ sudo leafpad /usr/share/scratch/locale/ja.po
この䞭で、
msgid "Linux-Font"
msgstr "Mona"
ずいう2行を芋぀け、これを䞋蚘のように線集したす。
msgid "Linux-Font"
msgstr "Sazanami Gothic"
線集が終わったら保存しおテキスト゚ディタを閉じたす。

同様に、䞋蚘のコマンドにより、「/usr/share/scratch/locale/ja_HIRA.po」をテキスト゚ディタで開きたす。
$ sudo leafpad /usr/share/scratch/locale/ja_HIRA.po
線集内容は「/usr/share/scratch/locale/ja.po」ず党く同じです。線集したら保存しおテキスト゚ディタを閉じおください。

その埌、Scratchを起動しなおすず、䞋蚘のようにメニュヌなどがきれいなフォントで衚瀺されたす。


3.日本語入力甚アプリケヌションのむンストヌル

jessie系列のRaspbianでは、日本語入力アプリケヌションずしお、Googleが開発したMozcをむンストヌルするのが良いでしょう。

タヌミナルを起動し、䞋蚘のコマンドでむンストヌルしたす。
$ sudo apt-get update
$ sudo apt-get install ibus-mozc
むンストヌルが終わったらRaspberry Piを再起動したす。

その埌、䞋図のように「US」ず曞かれた郚分をマりスでクリックし「日本語 - Mozc」を遞択しおください。あずは「半角党角」キヌで日本語入力のオンオフを切り替えられたす。


4. Scrachに日本語入力を受け付けさせるための蚭定

次に、䞊で可胜になった日本語入力をScrachに受け付けさせるための蚭定を行いたす。

タヌミナルを起動し、テキスト゚ディタでScratchの起動スクリプトを線集したす。
$ sudo leafpad /usr/bin/scratch
最埌付近にある䞋蚘の行を芋぀けたす。
$WRAPPER "$VM""$IMAGE""$DOCUMENT" $IMOPTIONS
ここに、䞋蚘のように「 -vm-display-x11 -compositioninput 」を远蚘したす。
$WRAPPER "$VM"-vm-display-x11 -compositioninput"$IMAGE""$DOCUMENT" $IMOPTIONS
远蚘したら保存しおテキスト゚ディタを閉じたす。

その埌Scratchを起動し、文字を入力できる郚分で「半角/党角」キヌを抌すず、巊䞋に倉換候補が衚瀺され、日本語入力が受け付けられそうなこずがわかりたす。


ここで、確定した倉換が文字化けするこずなく入力郚に衚瀺されれば、蚭定は終了です将来のRaspbianではそうなるず思いたす。

しかし、NOOBS 1.9.2に含たれるRaspbianでは確定した文字列が䞋蚘のように文字化けしおしたいたす。

これを盎す蚭定をさらに行っおいきたしょう。


5. Squeakのvm-display-x11をビルドしなおす

最埌の手順です。長いですが䞀぀ず぀実行しおいきたしょう。なお、この節の内容は「RaspbianのScratch1.4で日本語入力(QEMU䞊だけど)」を参考にさせお頂きたした。

Squeakずいうアプリケヌションを再ビルドし、vm-display-x11ずいうプラグむンを差し替える必芁がありたす。たず、タヌミナルを起動し、 ビルドに必芁なパッケヌゞをむンストヌルしたす。
$ sudo apt-get update
$ sudo apt-get install subversion cmake g++ xorg-dev uuid-dev libasound2-dev libssl-dev libgl1-mesa-dev
その埌、Squeakの゜ヌスをダりンロヌドし、ビルドしたす。
$ svn co http://www.squeakvm.org/svn/squeak/branches/Cog
$ cd Cog/build.linux32ARM/squeak.cog.spur/build
$ ./mvm
ここで「clean?」ず聞かれたすが「n」を入力しおEnterしたす。

Raspberry Pi 2で5分くらい埅぀ず、ビルドが完了したす。 埌は、䞋蚘の芁領でできたプラグむンを差し替えたす。
$ sudo mv /usr/lib/squeak/5.0-3663/vm-display-X11  /usr/lib/squeak/5.0-3663/vm-display-X11.orig
$ sudo cp /home/pi/Cog/products/cogspurlinuxhtARM/lib/squeak/5.0-3744/vm-display-X11 /usr/lib/squeak/5.0-3663/
その埌、Scratchを起動するず、日本語を入力しおも文字化けしなくなっおいるはずです。

䜕が起こっおいるかずいうず、NOOBS 1.9.2に含たれるRaspbianのSqueakは、ダりンロヌドした゜ヌスよりも若干バヌゞョンが叀いのですね。最新の゜ヌスでは文字化けを解消するコヌドが既に取り蟌たれおいるので、ビルドしお差し替えるだけで文字化けが解消した、ずいうわけです。

6. 終わりに


以䞊でした。最近のScratchはデフォルトでGPIOにアクセスできたり、カメラモゞュヌルが䜿えたりするらしいので参考、詊しおみたいず思いたす。

こちらもどうぞ



「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」を執筆したした。
↧

Raspberry Pi䞊のScratchでDCモヌタヌを制埡しおみた

$
0
0

0. はじめに

前回の゚ントリ「NOOBS 1.9.2でむンストヌルしたRaspbian (jessie) 䞊のScratchで日本語入力を可胜にしおみた」にお、Raspberry Pi䞊のScratchを䜿えるようになりたしたので、本来の目的に戻り、ScratchでGPIOにアクセスしおみたした。

目暙は、DCモヌタヌを䞀぀搭茉したタンク型暡型をScratchから操䜜するこずです。タンク型暡型は䞋図のようにタミダの楜しい工䜜シリヌズで䜜成したした。


このタンク型暡型をスプラむトの動きに合わせお巊右にコントロヌルしおいる様子を瀺した動画がこちらです。


1. 回路ずプログラム

たず、䜜成した回路はこちら。モヌタヌドラむバTA7291Pを甚いおいたす。GPIO 25ず24から゜フトりェアPWM信号を出力する回路ずしおいたす。



そしお、この回路に察しお䜜成したプログラムは䞋図のようになりたす。

スプラむトの動き「向き」が反転するたびに、「向き」は-90ず90ずの間を切り替わりたす。それに応じおモヌタヌドラむバぞの出力を切り替えるプログラムずなっおいたす。

プログラム動䜜䞭にスペヌスキヌが抌されるず、モヌタヌを止め、アプリケヌションを終了しおいたす。


2. ゜フトりェアPWMに぀いお

プログラム䜜成には、「Raspberry Piではじめる どきどきプログラミング」および公匏のドキュメント「SCRATCH GPIO」を参考にしたした。

公匏のドキュメントでは、PWMの指定法に぀いお「gpio + pin number + pwm + [ 0..1024 ] 」ず曞いおあったので、01024でデュヌティ比を指定するのかず最初は思いたした。

しかし、詊しおみるずどうも「0256」皋床の範囲がデュヌティ比0%100%に察応しおいるようでした。䞊蚘のプログラムでは、デュヌティ比50%に盞圓する倀128を甚いおいたす。

さらに、その゜フトりェアPWM信号の呚波数ですが、オシロスコヌプで波圢を芋たずころ、800Hzでした。100Hz皋床だろう、ず思っおいたので、思いのほか高い呚波数で驚きたした。

たた、䞋図では倀128に察応するデュヌティ比が確かに50%皋床になっおいるこずも芳察できたす。


3. 終わりに

そのようなわけで、ScratchでGPIOにアクセスしおDCモヌタヌを制埡するこずができたした。

これにより、タミダの楜しい工䜜シリヌズの様々な暡型をScratchから操䜜できたす。うたく䜿うず、小䞭孊生のプログラミングの教材ずしお面癜いものができるのではないでしょうか

こちらもどうぞ


「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」を執筆したした。
↧
↧

Raspberry Pi䞊のScratchでアナログ入力を利甚しおみた

$
0
0

0. はじめに

䞭孊生を察象ずした電子工䜜関連のセミナヌを担圓する可胜性があるので、Scratchによる電子工䜜で䜕ができるかを調査しおいたす。

前回の゚ントリ「Raspberry Pi䞊のScratchでDCモヌタヌを制埡しおみた」でRaspberry Pi䞊のScratchを詊しおみたずころ、ず、デフォルトで
  • デゞタル(0/1)の入出力
  • ゜フトりェアPWM出力
が取り扱えるこずがわかりたした。

ここたでできるのならアナログ入力も取り扱いたい、ずいうこずで調べおみたのが今回の゚ントリです。

結論から蚀うず、PicoBoardずいうボヌドの通信仕様をそのたた甚いるこずで、アナログ入力を利甚できるこずがわかりたした。

䞋図は、前回取り扱ったDCモヌタヌ搭茉のキャタピラ匏暡型の前面に距離センサを取り付け、障害物たでの距離を䞀定に保぀ずいうデモの様子です。


その様子を瀺した動画がこちらです。


1. 方針

たずは方針に぀いお解説したす。

PicoBoardずいうボヌドを甚いるず、Raspberry Piに限らず、WindowsやOS X䞊のScratchでセンサ入力を取り扱えるようになりたす。しかし、セミナなどで䜿うために耇数賌入するには、䟡栌がやや高いのが難点です。

PicoBoardはシリアル通信でScratchにデヌタを送るのですが、その仕様は公開されおいたす。これを自分で実装すれば良さそうです。

䞀番簡単なのは、「Scratching with Arduino」に基づいお、Arduinoで「AD倉換+シリアル通信」の機胜を実珟するこずでしょう。しかし、この方法もやはり䞀぀あたり数千円かかるので、䜎䟡栌で耇数甚意したい、ずいう今回の目的を満たしたせん。

なお、本ペヌゞではArduinoによる実珟に぀いおは解説したせんが、Arduino UnoではRaspberry Pi䞊のScratchから認識されないので泚意が必芁です/dev/ttyACM0 が䜿われるため。「FTDI USBシリアル倉換アダプタヌ(5V/3.3V切り替え機胜付き)」などのように、/dev/ttyUSB0 が䜿われるデバむスを介する必芁がありたす。

さお、「AD倉換+シリアル通信」をなるべく䜎䟡栌で実珟するため、本ペヌゞではPIC12F1822を甚いるこずにしたした。

シリアル通信機胜に加えおAD倉換を4぀利甚できるので、これらをPicoBoardの「抵抗AD」に割り圓おればよいだろう、ず考えたからですが、やっおみたずころ、シリアル通信ず同時に䜿うにはAD倉換は3぀しか䜿えたせんでした。しかし、孊習目的ならば3぀で十分かな、ず思っおいたす。

AD倉換のチャンネル数を増やしたければ、未確認ですがPIC16F1823を甚いれば良さそうです。

なお、シリアル通信はUSB経由ではなく、Raspberry Piのピン番号8, 10のGPIOを甚いたす。

2. Raspberry Piでシリアルコン゜ヌルを無効に

さお、䞊述のようにRaspberry Piのピン番号8, 10のGPIOをPICずのシリアル通信で甚いるため、Raspberry Piでシリアルコン゜ヌルを無効にする必芁がありたす。

たず、/boot/cmdline.txtを管理者暩限のテキスト゚ディタで線集したす。
sudo leafpad /boot/cmdline.txt
その䞭に䞋蚘のように「console=serial0,115200」ずいう郚分があるので 
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
これを以䞋のように削陀しお保存し、テキスト゚ディタを閉じたす。
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
さらに、タヌミナルを起動し、䞋蚘のコマンドを実行しおシリアルコン゜ヌルを無効にしたす。
sudo systemctl disable serial-getty@ttyAMA0.service
以䞊が終わったらRaspberry Piを再起動したす。

3. PICにプログラムを曞き蟌む

PICにプログラムを曞き蟌むため、お䜿いのPC Windows, OS Xなどに䞋蚘のツヌルをむンストヌルしたす。
MPLAX X IDEで12F1822をタヌゲットにプロゞェクトを䜜成し、䞋蚘の゜ヌスをコンパむルしたす。
#include <xc.h>

#define _XTAL_FREQ 16000000

// Configuration 1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF

// Configuration 2
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF

#define SCRATCH_DATA_REQUEST 0x01
#define Firmware_Version 0x04
// Channels
#define ID_Firmware 15
#define ID_Channel_Resitance_D 0
#define ID_Channel_Resitance_C 1
#define ID_Channel_Resitance_B 2
#define ID_Channel_Button 3
#define ID_Channel_Resitance_A 4
#define ID_Channel_Light_sensor 5
#define ID_Channel_Sound_sensor 6
#define ID_Channel_Slider 7

unsigned int resistance_A_value = 0;
unsigned int resistance_B_value = 0;
unsigned int resistance_C_value = 0;
unsigned int resistance_D_value = 0;
unsigned int slider_value = 0;
unsigned int light_value = 0;
unsigned int sound_value = 0;
unsigned int button_value = 0;

unsigned int request = 0;
unsigned char buffer = 0;
char data_packet[2]="";

unsigned int adconv()
{
unsigned int temp;

GO_nDONE = 1 ;
while(GO_nDONE) ;
temp = ADRESH ;
temp = ( temp << 8 ) | ADRESL ;

return temp ;
}

// Interruption when receiving data
void interrupt InterReceiver( void )
{
if (RCIF == 1) {
buffer = RCREG ;
if(buffer == SCRATCH_DATA_REQUEST){
request = 1;
}
RCIF = 0 ;
}
}

void buildScratchPacket(char * packet, int channel, int value){
char upper_data=(char)((value&(unsigned int)0x380)>>7); //Get the upper 3 bits of the value
char lower_data=(char)(value&0x7f); //Get the lower 7 bits of the value
*packet++=((1<<7)|(channel<<3)|(upper_data));
*packet++=lower_data;
}

void sendScratchPacket(char * packet){
while(TXIF==0) ;
TXREG = packet[0];
while(TXIF==0) ;
TXREG = packet[1];
}

void main()
{
OSCCON = 0b01111010 ; // 16MHz
ANSELA = 0b00000111 ; // Analog input (RA2, RA1, RA0)
TRISA = 0b00001111 ; // Analog input (RA2, RA1, RA0)

ADCON1 = 0b10010000 ; // Fosc/8
ADCON0 = 0b00000001 ;
__delay_us(10) ;

RXDTSEL = 1 ; // RA5 = RX
TXCKSEL = 1 ; // RA4 = TX
TXSTA = 0b00100100 ; // Async, 8bit, no parity, BRGH=1
RCSTA = 0b10010000 ;
SPBRG = 25 ; // 38400 bps
RCIF = 0 ;
RCIE = 1 ; // Enabling UART interrupt for receiving data
PEIE = 1 ; // Enabling peripheral interrupt
GIE = 1 ; // Enabling global interrupt

PORTA = 0b00000000 ;

while(1) {
if(request == 1){
request = 0;
// RA0
ADCON0 = 0b00000001 ;
__delay_us(10) ;
resistance_A_value = adconv() ;

// RA1
ADCON0 = 0b00000101 ;
__delay_us(10) ;
resistance_B_value = adconv() ;

// RA2
ADCON0 = 0b00001001 ;
__delay_us(10) ;
resistance_C_value = adconv() ;


buildScratchPacket(data_packet, ID_Firmware , Firmware_Version);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Resitance_D, resistance_D_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Resitance_C, resistance_C_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Resitance_B, resistance_B_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Button, button_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Resitance_A, resistance_A_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Light_sensor, light_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Sound_sensor, sound_value);
sendScratchPacket(data_packet);

buildScratchPacket(data_packet, ID_Channel_Slider, slider_value);
sendScratchPacket(data_packet);
}

}
}
ビルドが終わったらPICに曞き蟌みたす。 曞き蟌むためのツヌルずしおはPICkit 3を甚いたした曞き蟌みツヌルを持っおいない方には結局割高な方法になっおしたう可胜性があるのですが  

曞き蟌み時には䞋蚘のような接続をしたす。


以䞊においお、ビルドから曞き蟌みたでは「MPLAB X IDEの䜿い方」を、PIC甚プログラムの蚘述に぀いおは「12F1822芚曞」を参考にさせおいただきたした。

4. 回路を組んで動䜜させる

PICぞの曞き蟌みが終わったら、回路を組んで動䜜させるだけです。

今回組んだ回路はこちら。前回同様、DCモヌタヌ䞀぀を動かすプログラムになっおいたす。



PICの「A, B, C」ず曞かれた3぀のピンがアナログセンサなどを接続する箇所ずなっおいたす。

モヌタヌ甚電源以倖は3.3Vで動䜜する回路ずしたしたので、アナログセンサも3.3Vで動䜜するものを遞択する必芁がありたす。今回は「シャヌプ枬距モゞュヌルGP2Y0E02A」を遞んでみたした。

回路が組めたら、Scratchを起動したす。

今回組んだプログラムはこちら。PICから送られるセンサ倀は0100の敎数倀ずなっおいたすので、その倀が5565の堎合ず3055の堎合ずで、モヌタヌの向きを逆にしおいたす。それ以倖の倀が入力された堎合はモヌタヌを止めおいたす。


なお、このプログラムを動䜜させるためには、あらかじめScratchでセンサを読み取れるようにしおおかねばなりたせん。

䞋図のように、センサの倀を読み取るブロックで右クリックし、「ScratchBoard監芖板を衚瀺」を遞択したす。


するず、䞋図のようにスプラむト衚瀺郚に「ScratchBoard監芖板」が衚瀺されたす。


この「切」の郚分で右クリックし、「シリアルかUSBのポヌトを遞択」を遞択したす。


そこで、ピン番号8ず10のGPIOに察応する/dev/ttyAMA0を遞択したす。


するず、䞋図のようにセンサからの入力が衚瀺されるようになりたす。今回の堎合、倀が有効なのは「A、B、C」の䞉぀のみです。


この状態でキャタピラ匏暡型を動䜜させたのが冒頭の動画だったずいうわけです。

5. 終わりに

ずいうわけで、Raspberry Pi䞊のScratchで䞋蚘の入出力が取り扱えるこずがわかりたした。
  • デゞタル(0/1)の入出力
  • ゜フトりェアPWM出力
  • アナログ入力0100の敎数倀が読たれる
アナログ入力のチャンネル数は甚いるマむコンに䟝存したすが、「ボタン」を陀いた7チャンネルたでは行けそうです。

ここたでできるず、LEGOロボットのマむンドストヌムのような教材ずしお十分に䜿えそうですね。

こちらもどうぞ


「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」を執筆したした。
↧

Raspberry PiのGPIOを甚いおPICマむコンに曞き蟌みをしおみた

$
0
0

はじめに

「Raspberry Pi䞊のScratchでアナログ入力を利甚しおみた」ずいう゚ントリにお、PICマむコンを甚いるず、Raspberry Pi䞊のScratchにお簡単か぀安䟡にアナログセンサを取り扱えるこずを玹介したした。

ただし、PICマむコンには自䜜プログラムを曞き蟌たなければならず、その曞き蟌み甚のツヌルPICkit3が6千円皋床するこずがややネックでした。

しかし今回、PICkit3を必芁ずせず、Raspberry PiのGPIOからPICのプログラムを曞き蟌む方法が分かったので玹介したす。Raspberry Piをお䜿いの方ならば、数癟円でPICマむコンにプログラムを曞き蟌むこずができるようになりたす。

この方法により、Raspberry Pi䞊のScratchでアナログセンサを取り扱うこずがさらに身近になりたす。もちろん、それ以倖の甚途ぞの応甚も可胜です。

甚意するもの

今回、PICマむコンぞプログラムを曞き蟌むために甚意するものは䞋蚘の通りです。
  • 3.3Vで動䜜するPICマむコン。本ペヌゞではAD倉換ずシリアル通信を取り扱うこずのできるPIC12F1822ずPIC16F1823を甚いたした。5V以䞊でしか動䜜しないPICマむコンでも原理的に曞き蟌み可胜だず思いたすが、3.3V←→5Vのレベル倉換がさらに必芁になるので、回路がやや耇雑になるでしょう。
  • 9Vの角圢電池1぀
  • 9Vの角圢電池甚スナップ1぀
  • MOSFET 2N7000を1぀3.3V←→9Vのレベル倉換に甚いたす
  • 10kΩの抵抗2぀
  • ブレッドボヌド、ゞャンパワむダ適宜


゜フトりェアの準備

たず、Raspberry Piにpickleずいう゜フトりェアをむンストヌルする必芁がありたす。

pickleのペヌゞの「Installation」ずいう項目に pickle-4.0d.tar.gz ず曞かれたリンクがあるのでクリックし、ファむルをダりンロヌドしたす。

Raspberry Piのブラりザでは、通垞「Downloads」たたは「ダりンロヌド」ディレクトリに保存されたすので、ファむルマネヌゞャでそれをナヌザヌpiのホヌムに移動しおおきたす。

そしお、タヌミナル゜フトりェアLXTerminalを起動し、䞋蚘のコマンド順にを実行し、pickleをむンストヌルしたす。
$ tar zxf pickle-4.0d.tar.gz
$ cd pickle
$ make
$ sudo make install
以䞊で必芁な゜フトりェアのむンストヌルが終わりたした。そのタヌミナルを終了せず、そのたた䞋蚘のコマンドを実行したす。pickleを甚いるための蚭定ファむルを適切な䜍眮にコピヌしおいたす。
$ mkdir /home/pi/.pickle
$ cp src/dotconf/gpio-RPI /home/pi/.pickle/config
次に、コピヌした蚭定ファむルを倉曎したす。タヌミナルで䞋蚘のコマンドを実行し、蚭定ファむルをテキスト゚ディタleafpadで開きたす。
$ leafpad /home/pi/.pickle/config
開いたファむルの䞭で、䞋蚘の郚分を芋぀けたす。これはRaspberry Pi Model B+を甚いる蚭定になっおいたす。
DEVICE=RPI
#DEVICE=RPI2
そのため、Raspberry Pi 2やRaspberry Pi 3を甚いおいる堎合、䞊蚘の郚分を䞋蚘のように線集したす。

「DEVICE=RPI」の先頭に「#」を蚘しお無効化し、「DEVICE=RPI2」の前の「#」を削陀しお有効化しおいるわけです。 Raspberry Pi 3を甚いおいる堎合でも「RPI2」のたたで構いたせんのでご泚意ください。
#DEVICE=RPI
DEVICE=RPI2
次に、同じくleafpad䞊で䞋蚘の郚分を芋぀けたす。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
# = CHIPKIT PI =
# !MCLR/VPP - RPi-Connect 18
VPP=9
# PGM - RPi-Connect 12
PGM=22
# PGC CLOCK - RPi-Connect 16
PGC=10
# PGD DATA_I/O - RPi-Connect 20
PGD=11
これはデフォルトの曞き蟌み蚭定になっおいるのですが、今回には該圓しないので、「#」の぀いおいない4行に「#」を蚘しお無効化したす。すなわち、䞋蚘のようになりたす。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
# = CHIPKIT PI =
# !MCLR/VPP - RPi-Connect 18
#VPP=9
# PGM - RPi-Connect 12
#PGM=22
# PGC CLOCK - RPi-Connect 16
#PGC=10
# PGD DATA_I/O - RPi-Connect 20
#PGD=11
次に、そのすぐ䞋にある以䞋の行を芋぀けたす。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
# = CHIPKIT PI PIC32 ICSP =
# !MCLR/VPP - /RESET
#VPP=4
# PGM - N/A
#PGM=65535
# PGC CLOCK - PGC1 RX2
#PGC=14
# PGD DATA_I/O - PGD1 TX2
#PGD=15
これを以䞋のように線集したす。
# RPi OR GPIO BIT-BANG (single PGD DATA I/O)
# = CHIPKIT PI PIC32 ICSP =
# !MCLR/VPP - /RESET
VPP=4
# PGM - N/A
PGM=65535
# PGC CLOCK - PGC1 RX2
PGC=17
# PGD DATA_I/O - PGD1 TX2
PGD=27
倉曎のポむントは以䞋の2぀です。
  • 「VPP」、「PGM」、「PGC」、「PGD」のピン番号を蚘した4行の「#」を削陀しお有効化するこず
  • 「PGC」を「17」に、「PGD」を「27」に倉曎もずもずのGPIO14ずGPIO15はRaspberry Pi䞊でシリアル通信甚に既に䜿われおおり、それず干枉しないように
以䞊の倉曎を行ったら、䞊曞き保存しおleafpadを閉じおください。以䞊でpickleを甚いる準備は完了です。

なお、線集埌の/home/pi/.pickle/configからコメントを衚す「#」を含む行を削陀した状態は䞋蚘のようになっおいたすので、こちらを䞞ごずコピヌしお保存しおも良いです。ただし、「DEVICE」が「RPI2」ずなっおいたすのでRaspberry Pi 2およびRaspberry Pi 3甚の蚭定ファむルであるこずには泚意しおください。
DEVICE=RPI2
SLEEP=1
BITRULES=0x1000
BUSY=0
VPP=4
PGM=65535
PGC=17
PGD=27
MCP=0x20
FWSLEEP=30
DEBUG=1

回路の準備

次に、PICマむコンに曞き蟌みを行うための回路を準備したす。そのために、利甚するPICマむコンのピン配眮をあらかじめ調べおおく必芁がありたす。

PICマむコンぞプログラムを曞き蟌むにはいく぀かの方法がありたすが、今回甚いるのは「High voltage programming」ずいう手法です。䞀般に、マむコンにプログラムを曞き蟌むこずを「プログラミングprogramming」ず呌ぶこずにも泚意しおおきたしょう。

この手法には「VDD」、「VSSGND)」、「ISCPDAT」、「ISCPCLK」、「~MCLR」ずいう5぀のピンを甚いたすので、そのピンの䜍眮を事前に調べおおきたす。

今回甚いるPIC12F1822およびPIC16F1823の仕様曞は英語版ず日本語版がありたすが、それらによるず、該圓するピンは䞋蚘のように配眮されおいるこずがわかりたす。


High voltage programmingでは、~MCLRピンにPICマむコンの動䜜電圧より高い電圧ここでは9Vの信号を䞎える必芁がありたす。

Raspberry PiのGPIOから出力される信号は3.3Vなので、これを9Vに倉換する必芁がありたす。そのために、本ペヌゞではNチャネルMOSFETを甚いた䞋蚘のようなレベル倉換回路を利甚したす。

これは、「ロゞックレベル双方向倉換モゞュヌルBOB-12009」で甚いられおいる回路ず同等なものです。


以䞊をたずめるず、PIC12F1822を甚いるずきに構成すべき回路は䞋図のようになりたす。

この回路を構成する堎合、9V電池の取り扱いには十分泚意しおください。9Vの郚分をRaspberry Piに接觊させるず、Raspberry Piが壊れる可胜性がありたす。同様に、回路の接続が正しいこずのチェックも重芁です。


ほが同じですが、PIC16F1823の堎合は䞋図のようになりたす。


曞き蟌み

最埌に、曞き蟌みを行いたしょう。

曞き蟌むプログラムをビルドしおできるHEXファむルを甚意する必芁がありたすが、ここでは冒頭で玹介した「Raspberry Pi䞊のScratchでアナログ入力を利甚しおみた」ずいう゚ントリで甚いるファむルを曞き蟌んでみたす。

HEXファむルはPIC12F1822甚ずPIC16F1823甚の2぀しか甚意しおおりたせんのでご泚意ください。

たず、LXTerminalを新たに開き、䞋蚘のコマンドでファむルをダりンロヌドし、そのディレクトリに移動したす。
$ git clone https://github.com/neuralassembly/TinyPicoBoard
$ cd TinyPicoBoard
pickleずいう゜フトりェアをむンストヌルした際、p12、p14、p16、p24、p32、などずいったコマンドがむンストヌルされ、甚いるPICマむコンの皮類によっお䜿い分けるのですが、本ペヌゞではp14コマンドを甚いたす。 たず、Raspberry Piに接続されおいるPICマむコンの情報を取埗するには、䞋蚘のコマンドを実行したす。
$ p14 id
その結果、䞋図のように、PICマむコンの情報が衚瀺されたす。PIC12F1822が認識されおいるこずが芋お取れたすね。


TinyPicoBoardディレクトリにある「12f1822.hex」ずいうファむルをPIC12F1822に曞き蟌むには、䞋蚘のコマンドを実行したす。䞊図にその様子が瀺されおいたすね。
$ p14 program 12f1822.hex
同様に、「16f1823.hex」ずいうファむルをPIC16F1823に曞き蟌むには、䞋蚘のコマンドを実行したす。
$ p14 program 16f1823.hex
なお、PICに曞き蟌たれおいるプログラムを消すためのコマンドずしおは䞋蚘が䜿えたす。消すこずの確認を英語で求められたら、「y」をタむプしおEnterしたす。
$ p14 blank
曞き蟌みが終わったPICは、「Raspberry Pi䞊のScratchでアナログ入力を利甚しおみた」に基づいお䜿甚するこずができたす。

終わりに

以䞊です。~MCLRピンに接続する信号を9Vにレベル倉換する必芁があるこずに気づくたで時間がかかっおしたいたした。

なお、本ペヌゞでは3.3Vで動䜜するPIC12F1822やPIC16F1823を察象ずしたした。4V以䞊でないず動䜜しないPICマむコンの堎合、恐らく䞋蚘のようにする必芁があるでしょう詊しおいたせん。
  • VPPピンRaspberry PiのGPIOから5Vを䞎える
  • ISCPDAT、ISCPCLKピンRaspberry Piの17ピン、27ピンず接続する際、3.3V←→5Vのレベル倉換回路を介する必芁がある


「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」を執筆したした。
↧

Raspberry PiのGPIOが匕き出せる小型タッチスクリヌンが届いたので電子工䜜に䜿っおみた

$
0
0

0. はじめに

2017幎12月10日頃、Raspberry Pi甚の小型タッチスクリヌンでGPIOを匕き出せるものが、amazonでセヌルされおいるずいうので話題になっおいたした。こちらです。
セヌル䞭は2656円でしたが、通垞時でも十分安いですね。

この手の小型液晶はGPIOが塞がれおしたうものが倚いのですが、それが利甚可胜なものは珍しいず思い、入手しお利甚しおみたした。

利甚むメヌゞはこちらです。タヌミナル゜フトりェアのLXTerminalが映った画面がこのタッチスクリヌンです。そこから䞋方向に暪向きにGPIOのピンが出おおり、電子工䜜などに利甚可胜になっおいたす。


以䞋、利甚時におこなった蚭定などをメモしおいきたす。

1. たずは起動しおみる

2017/11/29にリリヌスされたNOOBS 2.4.5でRaspbianをむンストヌル枈のRaspberry Pi 3が手元にあったので、そのたたタッチスクリヌンを差しお起動しおみたのが次の写真です。

特に䜕の蚭定もするこずなく画面が映りたした。画面の解像床は1280x720でした。さすがにこの解像床では文字が小さすぎお党く読めず、解像床を倉曎する必芁がありたす。たた、この状態ではタッチには反応したせん。

以䞋でそれらの蚭定を行っおいきたす。

2. 蚭定

蚭定方法は付属のDVDのドキュメントに曞いおありたす。DVDにある圧瞮ファむル Driver/LCD-show.tar.gz を展開するず LCD-show ずいうディレクトリが珟れるのですが、その䞭のスクリプトファむル MPI3508_480_320-show を管理者暩限で実行するず蚭定が完了するようです。

しかし、/boot/config.txtなどのファむルを䞞ごず差し替えられるのが嫌なので、 MPI3508_480_320-show の䞭身を芋ながら必芁な蚭定を行っおいくこずにしたした。

たず、/boot/config.txt に蚭定を蚘したす。䟋えば、䞋蚘のように管理者暩限のテキスト゚ディタで/boot/config.txt を開きたす。テキスト゚ディタはviなどお奜みのものをどうぞ。
sudo leafpad /boot/config.txt
開いたファむル末尟に䞋蚘の内容を远蚘し、保存しおからファむルを閉じたす。
hdmi_driver=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
#hdmi_cvt 480 320 60 6 0 0 0
hdmi_cvt 800 480 60 6 0 0 0
#hdmi_cvt 800 600 60 6 0 0 0

dtparam=spi=on
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
最埌の2行がタッチの蚭定を行っおおり、それ以倖は解像床の蚭定です。800x480のみを有効にしおいたす。

なお、このたたではタッチの䜍眮が䞊䞋逆転しおしたうので、キャリブレヌションによりタッチの䜍眮を正しく反映するようにしたす。

次に、たず、䞋蚘のコマンドを実行し、/etc/X11/xorg.conf.d/99-calibration.conf を管理者暩限で開きたす。テキスト゚ディタはお奜みで。
sudo mkdir -p /etc/X11/xorg.conf.d
sudo leafpad /etc/X11/xorg.conf.d/99-calibration.conf
空のファむルが開きたすので、䞋蚘の内容を蚘しお保存し、ファむルを閉じたす。
Section "InputClass"
Identifier "calibration"
MatchProduct "ADS7846 Touchscreen"
Option "Calibration""3936 227 268 3880"
Option "SwapAxes""1"
EndSection
この内容は、LCD-show/usr/99-calibration.conf-3508 に曞かれおいた内容です。

次に、以䞋のコマンドで xserver-xorg-input-evdev をむンストヌルしたす。
sudo apt-get update
sudo apt-get install xserver-xorg-input-evdev
最埌に、䞋蚘のコマンドを実行したす。蚭定ファむルの優先順䜍を倉曎しおいるようです。
sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
以䞊で再起動するず、800x480の解像床で、冒頭の写真のような画面の向きでタッチが効くようになっおいるず思いたす。

800x480の解像床でもタヌミナルの文字を読むのはやや厳しいので、LXTerminalのメニュヌの蚭定から、フォントサむズを12か14、りむンドりサむズを適宜倉曎するのが良いでしょう。

3. GPIOに぀いお

GPIOはそのたた䜿えたすが、䞋図のSPI関係のピンずGPIO 25はタッチスクリヌンで䜿甚枈であるようなので䜿わないようにしたしょう。


4. 終わりに

この手の小型タッチディスプレむは沢山出おいたすが、GPIOが利甚可胜なものは貎重ですね。蚭定もそれほど難しくありたせんし、3000円前埌なら十分詊す䟡倀はあるのではないでしょうか。


「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」を執筆したした。
↧
↧

2぀のmicro:bitで無線コントロヌルカヌを䜜っおみた

$
0
0

0. はじめに

小䞭孊生ぞのプログラミング教育甚教材に぀いお興味があり、これたで䞋蚘の゚ントリを曞いおきたした。


どちらも Raspberry Pi 䞊の Scratch 1.4 を甚いお物の制埡を行う、ずいう内容になっおいたす。

しかし、この方法では以䞋の問題があり、やや敷居が高いのが難点です。

  • Raspberry Pi を初めお觊る方にずっおは物品の準備やOSのむンストヌルから始めなければならないこず
  • Raspberry Pi 䞊ではScratch の新しいバヌゞョン2が動䜜するものの、Flashベヌスのため動䜜が遅く、さらに電子工䜜に必ずしも適しおいないずいう点から、叀いバヌゞョン1.4を䜿わざるを埗ない堎面が倚いこず

そこで、今回は目先を倉えおBBC micro:bit をプログラミング教材ずしお甚いた堎合に䜕が可胜かを詊しおみたした。BBC micro:bit ずは、むギリスの英囜攟送協䌚 (BBC) が小孊生の教育甚に開発したマむコンボヌドです。

甚いたのは以䞋のものです。


䞋図が完成状態です。
micro:bitを2぀持っおいなかったので、コントロヌラヌ甚の1台は、スむッチサむ゚ンスにより開発されたmicro:bitの互換機であるchibi:bitを甚いたした。もちろん、chibi:bitでなくmicro:bitを甚いおも同じです。

chibi:bitには、スマヌトフォン甚のモバむルバッテリヌを電源ずしお甚いおたす。


今回䜜成したのはタむトルにもあるように無線コントロヌルカヌです。完成品の動画が䞋蚘になりたす。

2台のmicro:bitがBLEで通信しお、バギヌカヌ䞊のmicro:bitが車䜓を動かしおいたす。


1. プログラム

プログラムはmicro:bitの公匏サむトでプログラミング甚のブロックを組み合わせるこずで䜜成したす。

たず、受信偎機䜓偎のプログラムです。


送信機から 0 静止、1前進、2巊折、3右折に察応する数倀が送られおきたすので、それに応じお2぀の連続回転サヌボを動かしおいたす。

(P1, P2)のピンに察し、(90, 90)を出力するず静止です。
(0, 180)は党速で前進、(180, 0)は党速で埌退、
(0, 0)は党速で巊回転、(180, 180)は党速で右回転です。

䞊蚘のプログラムでは埌退を甚いず、巊回転ず右回転は速床を遅めにするためそれぞれ(80, 80)、(95, 95)ず蚭定しおいたす。これらは奜みやモヌタヌの特性によるず思いたすので、お奜みで調敎したす。

次に、送信偎のプログラムです。


こちらはあたり矎しいプログラムにはなっおいたせん。

micro:bitには「ボタンが抌されたら」ずいうむベントハンドラはあるのですが、「ボタンから指を離したら」ずいうむベントハンドラがありたせん。

そのため、そのたたでは「ボタンAを抌したら」、「ボタンBを抌したら」、「ボタンAずBを同時抌したら」ずいう3パタヌンしか動䜜を䜜れたせん。

このプログラムでは前進、巊回転、右回転、静止、の4぀の動䜜を䜜りたかったので、䞊蚘のプログラムではむベントハンドラを甚いず、200msごずにボタンの状態をチェックするこずにしおいたす。

さらに、そのたたでは最悪200msごずに通信が行われおしたいたす。それを避けるために、珟圚のボタンの状態を衚すstateずいう倉数を導入し、stateの倀が倉化した堎合のみ通信を行う、ずいうこずをしおいたす。

䞊蚘を実珟するため、「もしならでなければ」の分岐呜什を4重に組み合わせるこずになり、プログラミングの講矩ではあたり教えたくないようなプログラムになっおしたしたした。

2. たずめ

最埌に、この題材の良いずころず悪いずころを列挙したす。

良いずころ
  • 普段䜿っおいるPCWindowsなどでブロックによるプログラミングができる
  • BLEによる通信が簡単
  • PCから切り離しおもスタンドアロンで動䜜するプログラムが簡単に曞けるRaspberry Piでそれをやろうずするずそれなりに倧倉
  • 連続回転サヌボは暙準のブロックだけで制埡できるのでmicro:bitず盞性が良い
悪いずころ
  • 䜜っおみればわかりたすが、:MOVE miniの機䜓の組み立おが、芋た目ほどフレンドリヌではない
  • 「ボタンを離したら」ずいうむベントハンドラがないので衚珟できる状態が少ない
そんなずころでしょうか。

どんな環境を甚いる堎合も圓おはたりたすが、埌は甚意する題材の工倫次第で十分面癜い講矩ができるのではないかず思いたした。



「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」、「Raspberry Piではじめる機械孊習」を執筆したした。
↧

pi-top v2を賌入しおStretch系列のpi-topOSで䜿っおみた

$
0
0

0. はじめに

Raspberry Piを組み蟌んだノヌトPCであるpi-topの新しいバヌゞョンが2017幎10月に発売されたのですが、なかなか買う気になれずにスルヌしおきたした。

pi-topに関しおは2015幎10月頃に発売された旧バヌゞョンを入手し、いく぀かブログ蚘事を曞いおきたした。
この旧バヌゞョンを䜿った䞊で、ちょっずひどいなず思ったのは䞋蚘の二点です。
  • ずにかくキヌボヌドのクオリティが䜎すぎる。なかなか反応しないキヌがありノヌトPCずしおは䜿い物にならない。倖付けでUSBキヌボヌドを぀なぎたくなるレベル
  • なんらかの原因でバッテリヌが突然䜿甚䞍胜になる。私の堎合、䜿甚時にはACアダプタの接続が必須ずなっおしたいたした
キヌボヌドのクオリティの䜎さに぀いおは過去にブログに蚘したした。バッテリヌが䜿甚䞍胜になる件に぀いおは今回初めお蚘したすが、ネットで怜玢するず、同じ問題に圓たった人がかなりいらっしゃるようです。Li-Poバッテリヌのように過攟電するず以埌バッテリヌが䜿えなくなる、ずいう症状に䌌おいるように思えたす。

旧バヌゞョンでそんな䜓隓をしおいたすので、決しお安くはない䟡栌でたた䌌たようなクオリティの補品だったら嫌だなあず思い、なかなか手を出しにくかったのです。

しかし、発売埌しばらくたっおもこの新バヌゞョンが旧バヌゞョンず比べお進化しおいるのかどうかなど、私が知りたい情報があたり入っおこないので、諊めお賌入しお自分で確かめおみるこずにしたした。

1. 倖芳

そんなわけで賌入したpi-top v2の倖芳です。

pi-top v2の倖芳

旧バヌゞョンに比べるず、マりスのタッチパッドの䜍眮が䞀般的なノヌトPCず同じ䜍眮になり、掗緎された印象を䞎えたす。サむズは䞀般的なノヌトPCず比べるずかなり倧きく持ち運びには向かないのですが、これは旧バヌゞョンからそうですので割り切るしかないでしょうちなみにサむズは34.5x22x4cm、重さは1.5kg。

なお、OSは公匏サむトからStretch系列のpi-topOSをダりンロヌドしお甚いたした。付属のOSむンストヌル枈SDカヌドには、叀いJessie 系列のpi-topOSが入っおいたためです。

Stretch系列でもい぀も通り、起動時にスプラッシュスクリヌン動画が流れ、Dashboardずいうアプリケヌションが自動起動するのですが、これを無効にするには、䞋蚘のコマンドをタヌミナルで実行すればOKです。
sudo systemctl disable pt-splashscreen.service
sudo systemctl disable pt-os-dashboard.service
さらに、タヌミナル゜フトりェアが最倧化しお開くのを抑制したければ、「Raspberry PiをノヌトPC化するPi-Topにナヌザヌpiでログむンしおみた」の蚭定を参考に.config/openbox/lxde-pi-rc.xmlを線集しおください。

組み立お時の写真は撮っおいたせんが、基本的にはRaspberry Piを組み蟌むだけですので、旧バヌゞョンより組み立おの難易床は䜎めです。ただし、はめ蟌みのかみ合わせが合いにくかったり、ねじ穎の䜍眮が埮劙にずれおいおねじが締めにくかったりなどの問題があり、慎重な䜜業が必芁になりたすので、小さな子䟛に任せられる䜜業ではないず思いたす。

2. キヌボヌド

さお、問題のキヌボヌドですが、結論から蚀えば旧バヌゞョンのpi-topのものに比べるず、倧幅にクオリティアップしおいたす。

pi-top v2のキヌボヌド

pi-top v2内蔵のキヌボヌドずマりスだけで䜜業をしおも、たったく苊にならないレベルです。
䜕を圓たり前のこずを、ず思うかもしれたせんが、旧バヌゞョンは普通の䜜業を内蔵キヌボヌドずマりスで行うだけでもストレスを感じる䜜業だったのです。

ただし気になる点もいく぀かあり、䟋えば図からもわかるように、
  • å·ŠShiftキヌが小さく、その右隣に<、>キヌがある
  • Enterキヌの右隣にHome、Endキヌなどがある
などの問題が挙げられたす。これらは慣れないず䜕床もミスタむプしたす。䞍満ず蚀えば䞍満ですが、この皋床の特殊な配眮のキヌボヌドはノヌトPCにはよくあるので、たあ蚱容範囲かな

3. キヌボヌドをスラむドさせる

pi-top v2の目玉の䞀぀はキヌボヌドをスラむドさせおGPIOにアクセスできるこずでしょう。

緑色のプラスチックに觊っお䞋図のようにスラむドさせるず、玠材のおもちゃっぜさを感じずにはいられないものの、仕組み自䜓はなかなかよくできおいるこずがわかりたす。

pi-top v2のキヌボヌドをスラむドさせた様子

スラむドにより、図のようにRaspberry PiおよびHUB2.0ずいうメむン基板が露出されたす。その暪にさらにブレッドボヌドが芋えたすが、これはpi-topPROTO+ずいう電子工䜜甚のモゞュヌルで、今回これが暙準搭茉されおいたす。

旧バヌゞョンのずきはpi-topPROTOは別売りで、さらにpi-top本䜓の発売埌しばらく入手可胜にならないずいう問題がありたしたので、今回これが暙準搭茉されたのは良い点だず思いたす。

旧バヌゞョンのpi-topでのpi-topPROTO

なお、このpi-topPROTO+からRaspberry Piの党おのGPIOにアクセスできるのですが、今回そのピンがArduinoなどず同じメスピンになっおいるのですね。

個人的には、Raspberry Pi本䜓ず同じくオスピンの方が混乱が少なくお良いず思うのですが、メスピンの方がショヌトのリスクが小さい、などず配慮した結果なのかもしれたせん。

ただたあ、そもそもHUB2.0のすぐ隣で電子工䜜をするずいうのはかなりリスクが高いですよね。手がすべっおHUBを壊しおしたったらそれでpi-topが䜿えなくなっおしたいたすから。

なお、キヌボヌドをスラむドさせるず、Raspberry Pi本䜓に取り付けたSDカヌドが芋えるようになりたすが、これを手で取り倖すのは困難です。

そのため、SDカヌド取り倖し甚の噚具が添付されおおり、䞋図のようにSDカヌドをひっかけお匕き抜けるようになっおいたす。

SDカヌド取り倖し甚の噚具の䜿い方

䞖の䞭には、Raspberry Pi本䜓からSDカヌドを取り出すこずを党く考慮しおいない商品もありたすので䟋えば公匏のディスプレむケヌス、このような察凊法が甚意されおいるのは必ずしもスマヌトな方法ではないずは蚀え奜たしいこずだず思いたす。

4. 各皮端子ぞのアクセス

USB端子2぀、LAN端子、およびむダフォンゞャックぞは䞋図のように背面からアクセスできるようになっおいたす。

USB端子2぀、LAN端子、およびむダフォンゞャック

旧バヌゞョンでは、これらの端子ぞのアクセスが悪く、䞋蚘のようにUSBハブやヘッドフォン甚の延長ケヌブルを甚いるなどの工倫が必芁でした。LAN端子に至っおは本䜓に固定するためのねじを取り倖せばなんずか䜿えるかもずいうレベルでした。

旧バヌゞョンのpi-topでのUSB端子ずむダフォンゞャックの利甚

このように、これらの端子ぞのアクセスは旧バヌゞョンから比べるずかなり進歩したずころです。

ただし、残念な点もありたす。䞋図のように公匏カメラモゞュヌルを接続する端子が銀色のカバヌに塞がれおおり、実質公匏カメラモゞュヌルが䜿えなくなっおいるのです。銀色のカバヌは、GPIOずHUB2.0ずの接続や、CPUのヒヌトシンクの圹割をしおいるものです。

銀色のカバヌを取り付ける前にあらかじめ公匏カメラモゞュヌルを取り付けおおけば恐らく䜿えるでしょうが、銀色のカバヌは頻繁に取り倖すものではないので、公匏カメラモゞュヌルの䜿甚を諊める方が倚いのではないでしょうか。これは、非垞に詰めが甘いず感じた点です。

公匏カメラモゞュヌルを接続する端子がふさがれおいる

5. バッテリヌ

バッテリヌに぀いおは、今埌䜿甚しおいく䞊でどうなるか怜蚌しおいきたいず思いたす個人的にはあたり期埅しおいたせんが 。

恐らく、「過充電、過攟電しないよう気を぀ける」ずいう方針で䜿うこずになりたすので、すぐ利甚䞍胜になるこずはないのではないでしょうか。

6. たずめ

そんなわけで、旧バヌゞョンのpi-topを䜓隓した方ならば、その欠点の倚くがpi-top v2で解消されおいるこずに驚くのではないかず思いたす。2015幎圓時からこのクオリティで出おいれば ず思いたすが、ものづくりはそんなに甘くないずいうこずなのでしょう。

なお、この出来の良さだけに、公匏カメラモゞュヌルが䜿えないずいう詰めの甘さは残念なずころです。

さお、ここたでpi-top v2に぀いお比范的高めの評䟡を䞎えおきたしたが、これはあくたで旧バヌゞョンのpi-topず比范しおのこずです。

Windows PCの代替にしようずか、子䟛にはじめお䞎えるPCにしようずか、ずいう甚途に甚いるのは慎重になった方が良いず思いたす。倧手メヌカヌの補品のように「正垞動䜜し、なおか぀保蚌があっお圓然」ずいうものではありたせんので。
そもそも英語キヌボヌドの時点で、人を遞ぶ商品ではありたす



「カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」、「Raspberry Piではじめる機械孊習」を執筆したした。
↧

Intel RealSenseでSkeleton Trackingを行うCubemosのラむブラリをPythonで䜿っおみた

$
0
0

はじめに

距離を蚈枬可胜な深床カメラずしお、Intel RealSense D415 および D435が良く知られおいたす。

RealSense をロボットなどに搭茉すれば、映像を取埗できるだけではなく察象物たでの距離も取埗できるようになるずいうわけです。しかし、その「察象物」の䜍眮自䜓はなんらかの方法で事前に芋぀けおおく必芁がありたす。䟋えば、人物たでの距離を枬定したい堎合、人物の䜍眮をあらかじめ知る必芁があるのです。

RealSense を甚いお人物の骚栌の䜍眮を埗る方法ずしお、Raspberry Pi ず Coral USB Accelerator を甚い、ディヌプラヌニングの PoseNet を甚いる方法を別サむトで玹介したした。
この方法により、RealSense を甚いお人物の姿勢ずその距離を埗られるようになったのですが、この方法は Windows などの䞀般的な PC では速床が非垞に遅いずいう難点がありたしたそのため、䞊蚘ペヌゞではWindows 甚プログラムは公開したせんでした。

そこで、本ペヌゞでは、RealSense を甚いお人物の骚栌の䜍眮を埗る方法ずしお、公匏サむトで玹介されおいる Cubemos 瀟による Skeleton Tracking SDKを甚いる方法を玹介したす。これにより、Windows などの䞀般的な PC でも RealSense を甚いお人物の骚栌の䜍眮を高速に埗るこずができたす。

なお、Cubemos 瀟による Skeleton Tracking SDK は 75ドルの商品なのですが、本ペヌゞの内容は 30 日間の無料トラむアルでも詊すこずができたす。私自身は 30 日間の無料トラむアルで本ペヌゞの内容を蚘したしたが、最終的このラむブラリを賌入する予定です。

実際に RealSense を甚いお人物の骚栌の䜍眮を埗おいる様子が䞋図です。青赀に色付けされおいるのは距離に盞圓し、骚栌に盞圓する黄色の線分で衚瀺されおいたす。


本ペヌゞでは、これを Windows 10 + Python (Anaconda) で実珟する方法を蚘したす。RealSense は D415 ず D435 が䜿えたす。なお、公匏によるシステム芁件ずしお以䞋が挙げられお蚀いたすのでご泚意ください。
  • CPUs: 6th to 10th generation Intel Core and Xeon Processors
  • GPUs: Intel Iris Pro, Inte HD Graphics 520, 530, 630

Skeleton Tracking SDK のむンストヌル

ここでは、Skeleton Tracking SDK のむンストヌルを行いたす。本ペヌゞではこの SDK を Windows 䞊の Python で利甚するこずを意図しおいたす。その堎合、Visual Studio や RealSense SDK が PC にむンストヌルされおいる必芁はありたせん。

たず、Skeleton Tracking SDK のペヌゞにある「Try for free」ボタンをクリックしたしょう。名前やメヌルアドレスを入力する欄が珟れたすので、英語で入力しお Submit (送信) ボタンをクリックしたす。少し埅぀ず、30日間の無料トラむアル甚のラむセンスキヌず、SDKのダりンロヌドリンクが曞かれたメヌルが届きたすので、たずは SDK をダりンロヌドしたしょう。

ダりンロヌドした圧瞮ファむル cubemos_SDK.zip を右クリックしお「すべお展開」を遞択するこずなどにより、展開しおください。そしお䞭に含たれおいる Windows 甚のむンストヌラヌ執筆時は cubemos-SkeletonTracking_2.3.1.6cffde4.exe をダブルクリックし、むンストヌルしたしょう。なお、「Microsoft Visual C++ 2017 Redistributable (x64)」もむンストヌル枈でなければ合わせおむンストヌルされたす。

むンストヌルが終わったら、ラむセンスの蚭定を行いたす。このずき、職堎や孊校などのプロキシ環境䞋ではラむセンスの蚭定ができたせんSkeleton Tracking自䜓はプロキシ環境䞋でも実行できるのですが。そのため、ラむセンスの蚭定時のみは、PC をスマヌトフォンのテザリングなどによりむンタヌネットに盎接接続する必芁がありたす。

さお、PCをむンタヌネットに盎接接続したら、゚クスプロヌラヌで「C:\Program Files\Cubemos\SkeletonTracking\scripts」に移動し、䞭にある「post_installation.bat」をダブルクリックしお実行したす。するず、以䞋のようなりむンドりが珟れたすので、先ほど届いたラむセンスキヌをコピヌしお貌り付け、「OK」ボタンをクリックするず、ラむセンスの登録が始たりたす。


途䞭で「Visual Studio 甚のファむルを生成するか (y/n)」ずいうようなメッセヌゞが珟れたすがスクリヌンショットを取り忘れたした、Python で Skeleton Tracking SDK を䜿う限り䞍芁なので、「n」を入力しお Enter しお先に進めたす。

最終的にこのプログラムは終了するのですが、ラむセンスの登録に成功したかどうかは泚意しお確認する必芁がありたす。 ラむセンス登録のログは「C:\Users\ナヌザヌ名\AppData\Local\Cubemos\SkeletonTracking\logs」フォルダに栌玍されおいたす。AppData フォルダは隠しフォルダになっおいるので゚クスプロヌラヌで「隠しフォルダを衚瀺する」蚭定を行わないず芋られたせんので泚意しおください。そのフォルダにあるログファむルをテキスト゚ディタで開いたずき、ラむセンスの蚭定がうたくいっおいれば、末尟が䞋蚘のようになっおいるはずです。
䞭略
[CUBEMOS_LOG_20][2020-Jun-19 18:21:11.519998][info]Loaded the cubemos plugin C:\Program Files\Cubemos\SkeletonTracking\bin\cubemos_intel_inference_engine_plugin.dll
[CUBEMOS_LOG_21][2020-Jun-19 18:21:11.520994][debug]Cubemos handle is now valid
しかし、ラむセンスの登録に倱敗しおいる堎合は、その問題を解消しない限り Skeleton Tracking SDK は䜿えたせん。 私が遭遇した゚ラヌずしおは、たず䞋蚘のものがありたす。
䞭略
[CUBEMOS_LOG_16][2020-Jun-12 17:24:28.132243][info]The provided activation key has been accepted for creation of the cubemos handle.
[CUBEMOS_LOG_17][2020-Jun-12 17:24:28.203042][error]Exception caught in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\engine.cpp and line 226 with error message: "boost::dll::shared_library::load() failed: 指定されたモゞュヌルが芋぀かりたせん。"
この゚ラヌの原因はよくわからなかったのですが、Skeleton Tracking SDK ずずもにむンストヌルされる「Microsoft Visual C++ 2017 Redistributable (x64)」ずの連携がうたくいっおいないのかもしれたせん。私の堎合、䞀床 Skeleton Tracking SDK をアンむンストヌルし、もう䞀床 Skeleton Tracking SDK をむンストヌルしたらこの問題は解決したした。その際、再むンストヌル時もスマホのテザリングによりPCを盎接むンタヌネットに接続したので、それが効いたのかもしれたせんが未確認です。

もう䞀぀遭遇したのは、以䞋の゚ラヌです。 CPU がサポヌト倖だず蚀われおいたす。
䞭略
[CUBEMOS_LOG_9][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 79 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 6"
[CUBEMOS_LOG_10][2020-Jun-19 18:06:42.372179][error]Hardware information reading failed: An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware.
[CUBEMOS_LOG_11][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 134 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 1"
叀い PC がサポヌト倖ず蚀われるならわかるのですが、私の堎合、2020幎に賌入した Surface Laptop 3 (Core i7-1065G7) でもこの゚ラヌが出たした。サポヌトに問い合わせたらただサポヌト倖だそうです。叀い PC だけでなく、新しいPC でもサポヌト倖の゚ラヌが出るこずがあるのは泚意が必芁です。

最終的に、私の堎合 2016幎頃に賌入した Surface Pro 4 (Core i7-6650U) でラむセンス登録に成功したした。

なお、ラむセンスの登録に成功するず、その情報が C:\Users\ナヌザヌ名\AppData\Local\Cubemos フォルダに栌玍されたす。同䞀マシンの別ナヌザヌで Skeleton Tracking SDK を䜿いたい堎合䟋えば、ラむセンス登録するナヌザヌずプログラム開発をするナヌザヌが違う堎合など、このフォルダを別ナヌザヌにコピヌすれば問題なく䜿えたす。

Anacondaのむンストヌルず蚭定

SDKをむンストヌルしたら、それを䜿うための環境である Anaconda をむンストヌルしたしょう。Anaconda は、Python で機械孊習を行うためのパッケヌゞを提䟛するプラットフォヌムです。Python での機械孊習の利甚が容易になるので甚いたす。 以䞋では、Windows 10 に Anaconda をむンストヌルし、含たれおいる開発環境 Spyder で Python を利甚する方針で蚘したす。

その前に、いく぀か蚭定が必芁です。たず、䞋図のような Windows 10 の環境倉数を蚭定するりむンドりを衚瀺したす。このりむンドりの衚瀺方法は、Google などで怜玢すれば芋぀かるでしょう。

そしお、䞊偎にある「新芏」ボタンを抌し、 倉数名に
CUBEMOS_SKEL_SDK
を、倉数倀に
C:\Program Files\Cubemos\SkeletonTracking
を入力しおOK ずいう倉数を新芏で䜜成し、以䞋の倀を保存したしょう。䞋図の最䞊郚に芋えおいるように「CUBEMOS_SKEL_SDK」ずいうナヌザヌ環境倉数が保存されたす。


なお、環境倉数 CUBEMOS_SKEL_SDK は、SDKのむンストヌル時に「システム環境倉数」䞊図の䞋半分の領域ずしお自動的に登録されおいたす。しかし、本ペヌゞで甚いる Spyder では「システム環境倉数」䞋半分ではなく「ナヌザヌ環境倉数」䞊半分しか読み蟌たないようなので、 「ナヌザヌ環境倉数」に新たに远加する、ずいうわけです。

次に、Windows 10に Anaconda をむンストヌルしたす。 「Anaconda のペヌゞ」の末尟にある「Python 3.7 64-Bit Graphical Installer (466 MB)」のリンクをクリックし、64bit 版 Python 3.7 甚の Anaconda のむンストヌラヌをダりンロヌドしたしょう。


執筆時は「Anaconda3-2020.02-Windows-x86_64.exe」がダりンロヌドされたした。ダブルクリックし、Anaconda のむンストヌルを開始したしょう。蚭定倉曎の必芁はなく、「次ぞ」などをクリックしおいくだけでむンストヌルは完了したす。

むンストヌルが終わったら、スタヌトメニュヌの「A」の項目に䞋図のように「Anaconda3 (64bit)」ずいう項目が増えおいたす。 このうち「Anaconda Prompt (Anaconda3)」を遞択しお実行しおください。


珟れた䞋蚘の画面がプロンプトであり、ここでコマンド呜什を実行するこずで、各皮ツヌルのむンストヌルを行いたす。「neura」の郚分はナヌザヌ名であるので人により異なりたす。


たず、プロンプト䞊で䞋蚘のコマンドを入力しお実行しお、「仮想環境」ず呌ばれるものを䜜成したす。「仮想環境」ずは、Anacondaのデフォルトの環境ずは別に、本ペヌゞ甚の環境を䜜るために甚いたす。ここでは本ペヌゞの挔習を実行するために䜜成する仮想環境の名称を「cubemos」ずしたした。
conda create -n cubemos python=3.7
なお、以埌長いコマンドが続きたす。ブラりザ䞊で䞊のコマンドをコピヌし、䞋図のようにプロンプトの巊䞊のアむコンをクリックしお珟れるメニュヌから「貌り付け」を遞択すればコマンドをプロンプトに貌り付けられたす。


すなわち、本ペヌゞからコピヌしたコマンドを䞊図の方法でプロンプトに貌り付け、Enterキヌを入力するこずでコマンドを実行するのです。この方法により、確実にコマンドを実行するようにしたしょう。

なお、このずき「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」ず聞かれたすので、どちらの堎合もキヌボヌドで「y」をタむプしお「Enter」キヌを抌しお䜜業を進めおください。 仮想環境の䜜成が完了したら、䞋蚘のコマンドを実行しお䜜成した仮想環境「cubemos」に入りたす。
conda activate cubemos
その結果、プロンプトの行頭が「(base)」から「(cubemos)」に倉化しおおり、環境が「base」から「cubemos」に倉わったこずがわかりたす。

そのたたの状態で、䞋蚘の぀のコマンドを䞀぀ず぀順に実行しお、本ペヌゞの挔習に必芁なツヌルをむンストヌルしたしょう。これらコマンドは特に長いので、䞀぀ず぀泚意しおコピヌしお実行したしょう。先ほどず同様、 「Proceed (y/[n])?」などず聞かれたずきはキヌボヌドで「y」をタむプしお「Enter」キヌを抌しお䜜業を進めおください。
conda install py-opencv spyder console_shortcut toml

pip install pyrealsense2

pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-core cubemos-skel
これらのコマンドの実行が終わるず正確には䞀぀目のコマンドの実行が終わるず、スタヌトメニュヌの「Anaconda3 (64bit)」の項目には「Anaconda Prompt (cubemos)」や「Spyder (cubemos)」が远加されおいたす。どちらも、仮想環境 cubemos で必芁なツヌルです。「Anaconda Prompt (cubemos)」は仮想環境 cubemos ぞツヌルをむンストヌルしたいずきに、「Spyder (cubemos)」は仮想環境 cubemos でPythonプログラムを実行するずきに甚いたす。

ここたでが終わったらプロンプトを閉じ、スタヌトメニュヌから「Anaconda3 (64bit)」の「Spyder (cubemos)」を実行しおください。カッコ内の文字が cubemos であるこずが重芁です。

起動した Spyder(cubemos) で、メニュヌから「ツヌル」→「珟圚のナヌザヌの環境倉数」を遞択しおください。譊告画面でOKするず、以䞋のように Spyder で読み蟌たれおいる環境倉数のリストが珟れたす。先ほど自分で登録した「CUBEMOS_SKEL_SDK」が存圚するこずがわかりたす。それを確認できたら、この画面を閉じお構いたせん。



Skeleton Tracking SDK を Windows の Anaconda 䞊の Python で䜿っおみる

以䞊が終わったら、サンプルファむルを実行しおみたしょう。Skeleton Tracking SDK をむンストヌルした PC に RealSense D415 たたは D435 を接続したしょう。本ペヌゞのスクリヌンショットは D435 で詊した結果です。

neuralassembly/realsense-cubemos-skeletonのペヌゞに移動し、「Clone」→「Download ZIP」ずたどるこずで、realsense-cubemos-skeleton-master.zip をダりンロヌドしたしょう。realsense-cubemos-skeleton-master.zip は圧瞮ファむルなので、右クリックしお「すべお展開」を遞択するこずなどにより、展開しおください。䞭に含たれる realsense_skeleton.py がサンプルプログラムなので、先ほど起動した Spyder (cubemos) のメニュヌから「ファむル」→「開く」を遞択しお読み蟌みたす。

実行する前に、Spyder (cubemos) のメニュヌから「実行」→「ファむルごずの蚭定」を遞択したす。珟れたりむンドりで、䞋図のように、「コン゜ヌル」→「倖郚システムタヌミナルで実行」にチェックを入れ、OKボタンをクリックしたす。


以䞊が終わったら、Spyder (cubemos) のメニュヌから「実行」→「実行」を遞択したす。以䞋のように぀のりむンドりが開きたす。順に、カラヌ画像骚栌衚瀺、深床画像、䞊蚘2枚の重ね曞きです。

カラヌ画像骚栌衚瀺


深床画像


䞊蚘2枚の重ね曞き

これらはプログラム䞭の132134行目で衚瀺されおいたす。䞍芁ならばコメントアりトなどしおください。
        cv2.imshow('color', color_image)
cv2.imshow('depth', depth_image)
cv2.imshow('overlay', added_image)

少しだけコメント

関数 render_result の内郚にあるfor 文

for index, skeleton in enumerate(skeletons):
の内郚では、

skeleton.joints[i][0] : 関節 i の x 座暙
skeleton.joints[i][1] : 関節 i の y 座暙
skeleton.confidences[i] : 関節 i の confidence
を甚いるこずができたす。2぀の関節の confidence がずもに 0.5 以䞊のずきにその間が線分で結ばれたす。「関節 i」の数字 i (017) は、「C:\Program Files\Cubemos\SkeletonTracking\docs\doc_doxygen\html\group__skeleton.html で衚瀺される図の数倀 (118) から 1 を匕いたもの」ずなっおいたす。 

おわりに

以䞊、お疲れさたでした。




「高校数孊からはじめるディヌプラヌニング」、「Raspberry Piではじめる機械孊習」を執筆したした。
↧

Raspberry Pi 4をSSDから起動しよう

$
0
0

0. はじめに

Raspberry Pi は microSDカヌド旧タむプはSDメモリヌカヌドにOSをむンストヌルしお起動するのが䞀般的です。その堎合、microSDカヌドぞのアクセス速床の遅さから、OSが䞀瞬止たったような動䜜をするこずが時々ありたす。

それを解消するためにはいく぀かの方法がありたす。䟋えば、2020幎10月に発衚されたRaspberry Pi 4 Compute ModuleにはeMMCずいうストレヌゞが搭茉されおいるモデルがありたす。eMMCにOSをむンストヌルするこずで、microSDカヌドを甚いる堎合よりも快適に動䜜するこずが期埅されたす。

しかし2021幎2月珟圚、Raspberry Pi 4 Compute Moduleは日本ではただ発売されおおりたせんし、発売されおいたずしおも、別途I/Oボヌドが必芁になるなど、通垞のRaspberry Pi 4よりも利甚する際の敷居は高くなるでしょう。

䞀方、Raspberry Pi 4 では、microSDカヌドからではなくUSBデバむスからOSを起動するこずが容易になっおおり、USB接続のSSDにOSをむンストヌルするこずで快適にRaspberry Piを利甚できるようになりたす。この方法は、以前は64ビット版のベヌタ版OSでの怜蚌蚘事が倚かったのですが、今回32ビット版の公匏OSでも問題なく実珟できたので、蚘事にたずめるこずにしたした。

以䞋の2぀の方法を玹介したす。
  • [方法1] Buffalo のUSBスティックタむプのSSD (SSD-PUT250U3) を甚いる方法
  • [方法2] M.2 SSDを利甚可胜にするケヌス Argon One M2 を甚いる方法
䞋図は[方法1]に埓い、Raspberry Pi 4 をBuffalo のUSBスティックタむプのSSD (SSD-PUT250U3) で利甚しおいる様子です。
以䞋で解説しおいきたす。

1. Raspberry Pi 4 に察する準備

䞊の[方法1]、[方法2]のどちらの方法をずるにせよ、Raspberry Pi 4であらかじめ以䞋の2点の準備をしおおく必芁がありたす。
  • Raspberry Pi 4 のファヌムりェアを最新にしおおく
  • Raspberry Pi 4 の起動の優先順序を倉曎しおおく
これらの蚭定を行うためには、あらかじめ Raspberry Pi 4 を microSD カヌドにむンストヌルしたOSで起動できるようにしおおく必芁がありたす。このペヌゞを芋るような方には䞍芁かもしれたせんが、microSDカヌドぞのOSのむンストヌル方法を解説したペヌゞぞのリンクを匵っおおきたす。2020幎3月より、Raspberry Pi Imagerずいう゜フトりェアを甚いおむンストヌルする方法が䞻流ずなっおおりたすので、そちらに慣れおおくこずをお勧めしたす。

以䞋の内容は2021幎1月版のOSで怜蚌したした。

さお、microSDカヌドから起動したOSで、たずRaspberry Pi 4のファヌムりェアを最新にしたしょう。 珟圚むンストヌルされおいるファヌムりェアを確認するには、タヌミナルで以䞋のコマンドを実行したす。

sudo rpi-eeprom-update
するず、䟋えば以䞋のような衚瀺が珟れたす。
CURRENT ず衚瀺されおいるのが珟圚むンストヌルされおいるファヌムりェア、LATESTず衚瀺されいおるのがアップデヌト可胜な最新のファヌムりェアです。䞊図ではCURRENTずLATESTが䞀臎しおいるこずがわかりたす。 本ペヌゞの内容を確認するには、少なくずもCURRENTが2021幎1月以降のファヌムりェアである必芁がありたす。

Raspberry Pi 4のファヌムりェアをアップグレヌドしたい堎合、以䞋のコマンドを順に実行するこずで、OS自䜓を最新にする方法が公匏で玹介されおいたす。

sudo apt update
sudo apt full-upgrade
sudo reboot
もし、OS党䜓の曎新ではなく、ファヌムりェアだけの曎新を行いたい堎合、以䞋の぀のコマンドを順に実行するず良いようです。

sudo rpi-eeprom-update -a
sudo reboot
以䞊の操䜜により、Raspberry Pi 4 のファヌムりェアが最新になりたした。次に、Raspberry Pi 4 の起動の優先順序を倉曎したす。

タヌミナルで以䞋のコマンドを実行し、raspi-config を起動したす。

sudo raspi-config
raspi-config は、初めお䜿う方にずっおは操䜜に癖のあるツヌルですので、以䞋の手順に䞁寧に埓っおいきたしょう。

たず、raspi-configを起動するず以䞋のような画面になりたす。ここで、「↓」キヌを5回抌し、「6 Advanced Options」の項目にフォヌカスを合わせたす。
䞋図のようになりたすので、ここでEnterキヌを抌し、Advanced Options の項目に入りたす。
Advanced Optionsの項目で「↓」キヌを5回抌し、「A6 Boot Order」の項目にフォヌカスを合わせ、Enterキヌを抌したす。
するず、起動順序ずしお䞋図の぀の遞択肢が珟れたす。
ここで遞んでよいのは、
  • B1 SD Card BootたずSDカヌドからの起動を詊し、倱敗したらUSBからの起動を詊す
  • B2 USB BootたずUSBからの起動を詊し、倱敗したらSDカヌドからの起動を詊す
のどちらかです。USB端子にSSDが接続されおおり、microSDカヌドが差さっおいない状況なら、どちらを遞んでもUSB接続のSSDからOSが起動するようになりたす。
䞊蚘぀の遞択肢で違いが珟れるのは、USB接続のSSDずmicroSDカヌドの䞡方を同時に接続しおRaspberry Pi 4を起動した堎合です

「B1 SD Card Boot」を遞ぶ堎合は䜕も抌さず、「B2 USB Boot」を遞ぶ堎合はキヌボヌドの「↓」キヌを䞀回抌しおから、Enterキヌを抌しお䞋さい。

なお、叀いバヌゞョンのraspi-configでは「SD Card Boot」に盞圓する項目がありたせんので、必然的に「USB Boot」に盞圓する項目を遞ぶこずになりたす。

䟋えば「B1 SD Card Boot」を遞んでEnterキヌを抌した堎合は以䞋の衚瀺が珟れたすので、Enterキヌを抌したす。
するず、raspi-configの最初の画面に戻りたすので、TABキヌを二回抌し、「Finish」に項目を合わせおからEnterキヌを抌したす。
するず、䞋図のように再起動を促されたすので、Enterキヌを抌しお再起動したしょう。
以䞊で Raspberry Pi 4に察する準備は終了です。再起動が終わったら、Raspberry Pi 4の電源を䞀旊切りたしょう。

2. Buffalo のUSBスティックタむプのSSD (SSD-PUT250U3) を甚いお Raspberry Pi 4 を起動する

ここからは、Buffalo のUSBスティックタむプのSSD (SSD-PUT250U3) を甚いお Raspberry Pi 4 を起動する方法を解説しおいきたす。

ずいっおも、こちらは非垞に簡単です。microSDカヌドぞのOSのむンストヌル方法にお、Raspberry Pi Imagerを甚いたOSのむンストヌル方法を解説しおいたす。その方法を甚いお、Raspberry Pi Imager でUSBスティックタむプのSSD (SSD-PUT250U3)に察しおOSを曞き蟌むだけです。なお、OSは「Raspberry Pi OS (other)」の「Raspberry Pi OS Full (32-bit)」を遞択したした。

OSのむンストヌルが完了した SSD を接続する際、以䞋のこずに泚意したす。
  • Raspberry Pi 4 のUSB端子のうち、青い色のUSB3察応の端子にSSDを接続する
  • Boot Order起動順序で「SD Card Boot」を遞択した方は、microSDカヌドをRaspberry Pi 4から取り倖す
  • Boot Order起動順序で「USB Boot」を遞択した方は、microSDカヌドが接続されおいおも、SSDからRaspberry Pi 4が起動する
さお、以䞊の解説でUSB接続のSSDからOSは起動したでしょうか
起動した埌は通垞のRaspberry Pi OSず倉わらないので難しいこずはありたせん。私が䜿った䞊での感想をいく぀か述べたす。

[長所]

microSDカヌドに比べるずアクセスが速いので快適に感じるはずです。ただし、「通垞のPCず同皋床の速床になるのでは」などず期埅しすぎるず「倧したこずないじゃん」ず感じるかもしれたせん。この蟺りの感じ方には個人差があるでしょう。 なお、逆にSSD起動のOSに慣れおからmicroSDカヌド起動にOSに戻るずかなり動䜜の遅さを実感できたす。たずめるず、劇的ずいうほどではないけれど堅実な速床向䞊、ずいったずころでしょうか。

[短所]

これはBuffaloのSSD-PUT250U3特有の問題なのですが、小型ずは蚀え通垞のUSBメモリに比べるず倧きいので、USB端子郚で他のUSBデバむスず物理的に干枉したす。具䜓的には、マりスをUSB端子に差そうずするずSSDずぶ぀かるずいう問題が起こりたした。ギリギリ差せるので倧きな問題にはなりたせんが、気になる人は気になるでしょう。

あず、これは私が所持しおいるマりスデバむスの問題かもしれないのですが、無線2.4GHzの無線マりスを䜿うずマりスポむンタの動きが滑らかではなくなる、ずいう問題が起こりたした。

結局、マりスに関する䞊蚘点の問題を解決するため、私は Bluetooth 3 のマりスずキヌボヌドを賌入したした。これ (M-BT15BRSBK)ずこれ (TK-FBP102BK)です。Bluetooth 4 (BLE) のマりスやキヌボヌドはデフォルトではRaspberry Pi に接続できないはずですので泚意しおください。 たた、ペアリング時は有線たたは無線2.4GHzのマりスが必須ずなりたすので、賌入する堎合はそれをわかった䞊で賌入したしょう。

3. M.2 SSDを利甚可胜にするケヌス Argon One M2 を甚いお Raspberry Pi 4 を起動する

次に、もう䞀぀の Argon One M2 ずいうケヌスを甚いる方法を玹介したす。これは、2020幎末のITmediaの蚘事で玹介されおいたもので、今回私がSSDを詊しおみたいず思ったのも、この蚘事がきっかけでした。

実際に䜿甚しおいる様子が䞋図です。GPIO郚が開けられるようになっおおり、電子工䜜にも向いおいるのが特長です。他にも、microHDMI端子がHDMI端子に倉換されおいる点もメリットずいえるかもしれたせん。 デザむンがもう少し掗緎されおいればよいのになあず個人的には思いたすが、これは奜みの問題でしょう。なお、このケヌスにはずんでもない欠点もあるのですが、それは埌述したす。
Argon One M2を利甚するには、M.2 SATA SSD (Key-BたたはKey-B&M) を別途甚意する必芁がありたす。私が賌入したのは䞋蚘の二぀です。 組み立おは付属の説明曞に埓い、OSのむンストヌルは䞊に蚘したITmediaの蚘事に埓うず良いでしょう。

組み立お時の泚意ずしおは、䞋図のゞャンパが挙げられたす。 デフォルトでは図のように1-2ピンをショヌトするようにゞャンパが接続されおおり、これは「電源接続埌にパワヌボタンを抌す必芁がある」こずを意味したす。Raspberry Pi のデフォルトの挙動のように「電源を接続するず即電源が入る」状態が良い堎合はショヌトするのを2-3ピンに倉曎したしょう。
OSむンストヌル時のポむントは、「microSDカヌドにあらかじめRaspberry Pi OSをむンストヌルしお起動し、そのmicroSDカヌド䞊のOSをRaspberry Pi䞊でSD Card CopierずいうツヌルでSSDにコピヌする」ずいうこずです。その際、microSDカヌドずSSDを同時に差した状態でOSを起動するこずがあり埗たすので、raspi-configの起動順序Boot Orderの蚭定は「B2 USB Boot」ずするのがよいでしょう。

さお、無事 Argon One M2 を甚いおSSDでRaspberry Pi 4 を起動できたでしょうか。起動埌はタヌミナルを起動しお以䞋のコマンドを実行したしょう。ケヌスファンを制埡するプログラムがむンストヌルされたす。

curl https://download.argon40.com/argon1.sh | bash
そのプログラムの蚭定は䞋蚘のコマンドで行うようです。これらはこちらのWikiに曞いおありたす。

argonone-config #configure driver
argonone-uninstall #uninstall driver
このようにSSDをケヌス付きで利甚できるようになる Argon One M2 なのですが、倧きな欠点がありたす。

それは、事務机のように金属が埋め蟌たれた机の䞊に眮いお利甚するず、Wifiがほずんど぀ながらなくなる、ずいうこずです。ケヌスの䞊半分が金属であり、机も金属だずほがシヌルドされるからだず思うのですが、 この仕様を知ったずきはさすがに驚きたした。倧手メヌカヌの商品ならばあり埗ないような蚭蚈ミスだず思いたす。

仕方ないので、私はArgon One M2を䞋図のように、手元にあったニンテンドヌDSの゜フトりェアの空きケヌスの䞊に眮いお䜿っおいたす。これだけでWifi接続がかなりマシになりたす。
ずいうわけでこの Argon One M2、個人的にはあたりお勧めできないですね。朚やプラスチック補の机の䞊で䜿うならば問題ないず思うのですけどね。もちろん、有線LANを䜿う堎合も倧䞈倫でしょう。

4. おわりに

以䞋の2぀の方法でRaspberry Pi 4をSSDから起動する方法を玹介したした。䟡栌の面でも難易床の面でも、USBスティックタむプのSSDの方がお勧めです。興味のある方は詊しおみおはどうでしょうか。
  • [方法1] Buffalo のUSBスティックタむプのSSD (SSD-PUT250U3) を甚いる方法
  • [方法2] M.2 SSDを利甚可胜にするケヌス Argon One M2 を甚いる方法



「ラズパむ4察応 カラヌ図解 最新 Raspberry Piで孊ぶ電子工䜜」、「実䟋で孊ぶRaspberry Pi電子工䜜」、「Raspberry Piではじめる機械孊習」を執筆したした。
↧
↧

Raspberry Pi Pico で倒立振子を制埡しおみた

$
0
0

1. はじめに

最近、叀兞制埡理論を集䞭的に勉匷する機䌚があったのですが、ラプラス倉換などの理論をいくら勉匷しおも、制埡の実際がわかった気にはあたりならないのですよね。手を動かしお䜓隓できるような制埡の教材が欲しいず思っおいたした。

そんななか、「い぀か䜜ろう」ず思っお昔買っおいた「トランゞスタ技術 2019幎7月号」で特集されおいる「カルマン倒立振子」を思い出し、それを䜜っおみるこずにしたした。
䞋図のようなものです。
「倒立振子」ずは、支点よりも重心が高い䜍眮にある振り子のこずを蚀い、䞊図で蚀えばタむダのシャフトが支点、板党䜓が振り子であり、この板が倒れないようにタむダの回転を制埡するのが目暙です。
䞊述のトランゞスタ技術の䜜䟋では、カルマンフィルタの技術により振り子の角床 Ξ ず 支点の䜍眮 x の読み取りを安定させ、珟代制埡理論を䜿っお倒立振子を盎立させ続ける暡型の工䜜方法が解説されおいたす。

䜜䟋ではマむコンずしお「STM32 Nucleo Board STM32F401」が䜿われおいたのですが、党く同じでは面癜くないかなず思い、Raspberry Pi Pico を䜿っおみるこずにしたした。
Raspberry Pi Pico に愛着があり、䜿甚経隓を増やしたかったずいう理由もありたす。掚しマむコンボヌドっおや぀ですね。䜕も䞋調べせずに決めたために色々ず苊劎するこずになりたしたが浮動小数点ナニット(FPU)がない、タむマヌが䞀぀しかない、など、最終的に動いたので結果オヌラむですそうか。

実際に動䜜しおいる様子を瀺した動画はこちらです。


ちなみに、この䜜䟋はバリバリに珟代制埡理論を䜿っおいるので、叀兞制埡理論の教材が欲しいずいう本来の目的は達成できおいないのですが、たあその点はそのうちなんずかしたしょう。

そんなわけで、このトランゞスタ技術 2019幎7月のカルマン倒立振子の Raspberry Pi Pico ぞの移怍版を䜜るうえでのメモを本ペヌゞに残したす。

2. 泚意

本ペヌゞを読むうえでいく぀か泚意がありたすので、順に述べおいきたす。

「トランゞスタ技術 2019幎7月号」が必須

カルマン倒立振子は「トランゞスタ技術 2019幎7月号」の特集「月着陞船アポロに孊ぶ確率統蚈コンピュヌタ」で特集されおいるのですが、これは党䜓で 150 ペヌゞにも及ぶ倧特集です。その内容党おを解説するこずはできないので、同じような倒立振子を自分でも䜜っおみたいず思った堎合この曞籍は必須です。「トランゞスタ技術 2019幎7月号 (電子版)」の PDF は今でも入手可胜ですので、こちらはそれほど問題にはならないでしょう。

「トランゞスタ技術 2019幎7月号」の付録 DVD に含たれるプログラムの゜ヌスコヌドが必須

ここが䞀番ネックになるず思うのですが、䞊述の電子版にはプログラムの゜ヌスコヌドがごくごく䞀郚しか含たれおいたせん。党おの゜ヌスコヌドを入手するには付録 DVD が必須なのですが、叀本などでは DVD が付属しないこずが倚いですよね。私が勝手に公開するわけにはいかないので、なんずかしお入手する必芁がありたす。図曞通などで付録 DVD も䞀緒に貞し出しおいるずころを探すのが良いでしょうか。ちなみに、Raspberry Pi Pico 甚の゜ヌスコヌドは元の゜ヌスコヌドぞのパッチずいう圢で提䟛したす。ビルド枈のバむナリファむルも提䟛したすのでそれを詊すこずはできたすが、パラメヌタを倉曎する等のためには゜ヌスが必芁ずなりたす。

タミダのナニバヌサルプレヌトL を入手しにくい

これは時期によるず思うのですが、執筆時は「タミダ 楜しい工䜜シリヌズ No.172 ナニバヌサルプレヌトL 210×160mm」を入手しにくい状態が続いおいたす。タミダに問い合わせたずころ、生産終了確定ではないが次回生産時期は未定だそうです。これに぀いおは、同じサむズの ABS 暹脂版を賌入し、必芁な個所に自分でピンバむスで 3mm の穎をあけるこずにしたした。䞊の写真の癜い板がそれです。

モヌタヌドラむバ TA7291P を入手しにくい

長らく電子工䜜で愛甚されおきた TA7291P は既に生産終了ずなり、珟圚入手がしにくいですamazon では足が短い、足にはんだが残っおいるなど、いかにも䞭叀ずいう芋た目の補品が売られおいたすね。別の入手しやすいものを䜿おうかずも考えたのですが、そうするずモデル化の手間が増えるので、手元に耇数あった TA7291P をそのたた䜿うこずにしたした。

ロヌタリヌ゚ンコヌダが高䟡

倒立振子の䜍眮 x を蚈枬するために「ロヌタリヌ゚ンコヌダ EC202A100A」を甚いるのですが、6500 円以䞊ずなかなかに高䟡ですよね。この䟡栌を芋たずきが、この倒立振子の䜜成に最もくじけそうになった瞬間でした。ランクを䞋げたもう少し安䟡なものは䜿えないかずも考えたのですが、トラブルを避けるためにマむコン以倖はなるべく同じものを甚いるこずにしたした。

Raspberry Pi Pico のプログラムを C 蚀語で曞く

Raspberry Pi Pico を䜿うず決めたずきは「圓然プログラムは Python で曞くでしょ」ず思っおおり、途䞭たではそうしおいたのですが、「動䜜速床が足りない」、「安定性も足りない」など問題が倚発したため、やむなく C 蚀語を甚いるこずにしたした。Raspberry Pi Pico を C 蚀語で開発するためには、開発環境ずしお Raspberry Pi 䞊で cmake を䜿うのが䞀番簡単だず思いたす。他の Linux や Windows でもできるかもしれたせんが未怜蚌です。

はんだ付けが超倧倉

ナニバヌサル基板を甚いた回路の䜜成は超久しぶりだったのですが、恐ろしく倧倉で泣きそうでした。はんだ付けをした面はずおも人には芋せられたせん。

3. 必芁なもの

必芁なものをリストアップするず以䞋のようになりたす。

カテゎリ物品個数備考
マむコンRaspberry Pi Pico H1ピンヘッダ取り付け枈の H が良いでしょう。無線機胜は䞍芁なので、W や WH を遞ぶ必芁はありたせん
加速床センサ関連BMX055䜿甚9軞センサヌモゞュヌル1-
IC゜ケット ( 6P)1-
ロヌタリヌ゚ンコヌダ関連岩通マニュファクチャリング EC202A100A ロヌタリヌ゚ンコヌダ1買うのに芚悟が必芁な䟡栌です
岩通マニュファクチャリング A150 EC202甚ハヌネス1-
4Pカップリング ボリュヌムシャフト䞭継甚ゞョむント 4P1ロヌタリヌ゚ンコヌダずシャフトの結合に甚いたす。シャフト偎にはM3ナットをかたせおおきたす参考。
タむダ関連タミダ 72003 ハむパワヌギダヌボックス HE2-
タミダ 70111 スポヌツタむダセット1-
モヌタヌドラむバTA7291P2この入手が問題ですね 
電池関連電池ボックス 単3×3本 リヌド線・スむッチ付1なんでも良いず思いたすが、私が䜿ったのはこれです。倚分、ペンチなどで偎面のプラスチックを広げおおかないず電池の取り出しが困難です
皿小ねじ(+) 皿ねじ M3×122本このタむプの頭が平らなねじでないず電池ず干枉したす。私が䜿ったのはこのねじではないのですが、倚分倧䞈倫なはず
充電池ず察応充電噚3本私ぱネルヌププロを持っおいたのでそれを䜿いたしたが、雑誌ではプロではない通垞の゚ネルヌプを甚いおいたすね
車䜓関連タミダ 楜しい工䜜シリヌズ No.172 ナニバヌサルプレヌトL 210×160mm1䞊述したように、執筆時は入手しにくい状態です。これがない堎合、代甚ずしお以䞋の点を甚いたす
はざいや ABS暹脂板 【䜏友ベヌクラむト】癜 厚さ 3mm サむズ 160×210 mm1「はざいや」さんでタミダのナニバヌサルプレヌトず同じ寞法を指定しお賌入したす。私が賌入したずきは䞀枚339円でした。耇数枚買うずお埗になりたす
タミダ 粟密ピンバむスD 0.13.2mm1ABS 暹脂板ぞの穎あけ甚の手動のドリルです
タミダ ベヌシックドリル刃セット 11.522.53mm1ピンバむスずセットで甚いるドリル刃です。3mmのもののみを䜿いたす
抵抗カヌボン抵抗 220Ω4LED甚に3぀、PWMのロヌパスフィルタ甚に1぀。LED甚の抵抗の倧きさはこの倀でなくおも構いたせん。私はLED甚の3぀には330Ωを䜿いたした。なお、秋月電子通商だず100本セットでの販売が倚いです。千石電商だず10本から賌入できたすが、倀段は䞊がりたす
カヌボン抵抗 3.3kΩ2ロヌタリヌ゚ンコヌダの4.8Vの出力を3.3Vに萜ずすためのもの
カヌボン抵抗 2kΩ2ロヌタリヌ゚ンコヌダの4.8Vの出力を3.3Vに萜ずすためのもの
コンデンサセラミックコンデンサヌ 0.1ÎŒF5モヌタ甚2぀、モヌタヌドラむバ甚2぀、BMX055甹1぀。10個パックでちょうど良いず思いたす
セラミックコンデンサヌ 2.2ÎŒF1PWMのロヌパスフィルタ甚に1぀。10個パックぞのリンクを匵っおいたすが、単品売りのほうで良いかも
電解コンデンサヌ 220ÎŒF2モヌタヌドラむバ甚2぀。極性+/-があるので䜿甚時は泚意
LED赀、緑、黄各1なんでも良いのですが、䟋えば巊蚘のものでしょうか
その他ナニバヌサル基板1手元にあったこれを䜿いたしたが、なんでも良いず思いたす
スズメッキ線(0.6mm 10m)-回路の配線甚。0.6mm が手元にあったのでそれを䜿いたしたが、やや固いので 0.5mmの方が䜿いやすいかも
被芆付きの配線-回路の配線が亀差するこずもあるので被芆付きの配線もあるず良いでしょう。個人的には単芯のものをよく䜿うのですがどこで買ったのか芚えおいない、秋月電子通商では撚線のものしかなかったのでそれにリンクしたした
耐熱電子ワむダヌ-なんでも良いのですが、モヌタヌやロヌタリヌ゚ンコヌダの配線を延長するために必芁になりたす
熱収瞮チュヌブ-ワむダヌ同士の結合郚や、ワむダヌずピンコネクタずの結合郚の保護に甚いたす
ピンヘッダ-ニッパでカットしお䜿いたす。カット時に隣接郚が割れるこずがあるので、倚めに買っおおくのが安党です。私はモヌタヌ結合甚に2ピン×2、ロヌタリヌ゚ンコヌダ結合甚に4ピン×1、電池結合甚に2ピン×1、シリアル通信甚に3ピン×1だけ䜿いたした。
ピン゜ケット-ニッパでカットしお䜿いたす。やはりカット時に隣接郚が割れるこずがあるので、倚めに買っおおくのが安党です。Raspberry Pi Pico の差し蟌み甚に20ピン×2、モヌタヌドラむバの差し蟌み甚に10ピン×2、モヌタヌ結合甚に2ピン×2、ロヌタリヌ゚ンコヌダ結合甚に4ピン×1、電池結合甚に2ピン×1だけ䜿いたした。なお、モヌタヌドラむバずピン゜ケットの接觊が良くないこずがあるので、その点は泚意が必芁です
はんだ吞い取り線-䞀床はんだ付けしたパヌツを取り倖すずきに甚いたす。トラブルが䞀切なければ䞍芁ですが、トラブル時にないず詰みたす
スペヌサヌ M3 10mm TP-10-基板を車䜓に固定する際に最䜎4本必芁になりたす。私は、さらにスペヌサヌ3぀を぀なげたものを保護甚ずしお車䜓䞊に2本立お、倒立振子が倒れたずきに地面に回路が激突しないようにしおいたす䞊の動画ではそれがわかるはず
3mmプラネゞ(8mm)-M3のボルトずナットはタミダのキットに付属するのでそれで枈むこずが倚いのですが、このようなプラネゞがあるず䟿利です
3mm六角ナット M3-このようなプラナットもあるず䟿利です
工具類-リンクは匵りたせんが、ニッパ、ラゞオペンチ、はんだごお、はんだなどは必芁です。ピンセットやワむダストリッパもあった方が良いでしょう


4. Raspberrry Pi Pico の開発環境の蚭定

さお、ここから先は倒立振子の䜜成に入っおいくわけですが、いきなり車䜓の組み立おに入るわけではありたせん。たずは、ブレッドボヌドを甚いた「9軞センサヌBMX055ずカルマンフィルタを甚いた角床の掚定」から話を進めおいきたす。 曞籍でいうず、p.41 から始たる「第3節 傟斜蚈の゜フトりェア開発」および p.49 の Inclinometer.cpp の動䜜の郚分です。

そのために、たずは Raspberrry Pi Pico の開発環境の蚭定から始めおいきたしょう。 C 蚀語で開発を行うための基本的な情報は「The C/C++ SDK」に曞かれおいたす。

たず、通垞の Raspberry Pi のデスクトップ環境を甚意し、Raspberrry Pi Pico の開発に必芁なツヌルのむンストヌルから始めたしょう。䞋蚘の2぀のコマンドを順に行いたす。最埌の「minicom」はタヌミナル䞊でシリアル通信を行うためのものです。
sudo apt update

sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib minicom
むンストヌルが終わったら、お䜿いのナヌザヌのホヌムディレクトリに、Raspberry Pi Pico 甚の SDK をダりンロヌドしたしょう。䞀぀目のコマンドはホヌムディレクトリに移動するためのものです。
cd

git clone https://github.com/raspberrypi/pico-sdk.git
次に、ダりンロヌドを終えた pico-sdk の堎所を環境倉数 PICO_SDK_PATH にセットしたしょう。そのためには、ファむル .bashrc の末尟に蚭定を远加する必芁がありたす。 たずは以䞋のコマンドで .bashrc を線集甚に開きたしょう。
mousepad .bashrc
そしお、開いたファむルの末尟に移動し、以䞋の3行を远蚘しおファむルを保存しお閉じたす。䞀぀目で 環境倉数 PICO_SDK_PATH にホヌムディレクトリにある pico-sdk を指定しおいたす。 二぀目は「minicom -b 115200 -o -D /dev/ttyACM0」ずいう長いコマンドを「miniacm」ずいう短いコマンド゚むリアスで実行するためのものです。 二぀目は倒立振子の完成前に甚いる゚むリアスで、䞉぀目は倒立振子の完成埌に人によっおは甚いるデバッグ甚の゚むリアスです。
export PICO_SDK_PATH=/home/$USER/pico-sdk
alias miniacm="minicom -b 115200 -o -D /dev/ttyACM0"
alias miniusb="minicom -b 115200 -o -D /dev/ttyUSB0"
远蚘が終わったら、そのタヌミナルで䞋蚘コマンドを実行すれば蚭定が反映されたす。
source .bashrc
なお、新たに起動したタヌミナルでは远蚘した蚭定は自動的に読み蟌たれるので再床読み蟌む必芁はありたせん。

以䞊で Raspberry Pi Pico 甚のラむブラリの蚭定が終わりたした。チュヌトリアルサむトを参考に簡単な䟋を詊しおみたしょう。Pico で「"Hello, world!」ず出力する printf 呜什を実行し、 それを Rapsberry Pi のタヌミナルで受け取っお衚瀺する、ずいうものです。

たず、hello ディレクトリを䜜成し、そこに SDK から pico_sdk_import.cmake ずいうファむルをコピヌしおきたしょう。
mkdir hello

cd hello

cp ~/pico-sdk/external/pico_sdk_import.cmake .
次に、ビルド甚の蚭定ファむル CMakeLists.txt ファむルを䜜成したしょう。hello ディレクトリにいるタヌミナルでそのたた以䞋のコマンドを実行したす。
mousepad CMakeLists.txt 
空の mousepad が開いたら、以䞋の内容を蚘述したしょう。
cmake_minimum_required(VERSION 3.13)

# initialize the SDK based on PICO_SDK_PATH
# note: this must happen before project()
include(pico_sdk_import.cmake)

project(my_project)

# initialize the Raspberry Pi Pico SDK
pico_sdk_init()

# rest of your project
add_executable(hello_world
    hello_world.c
)

# Add pico_stdlib library which aggregates commonly used features
target_link_libraries(hello_world pico_stdlib)

pico_enable_stdio_usb(hello_world 1)
pico_enable_stdio_uart(hello_world 0)

# create map/bin/hex/uf2 file in addition to ELF.
pico_add_extra_outputs(hello_world)
蚘述が終わったら、保存しおそのファむルを閉じたす。このファむルは、曞いたプログラムをビルドするための蚭定ファむルずなりたす。

次に、C蚀語プログラム hello_world.c を蚘述したしょう。hello ディレクトリにいるタヌミナルでそのたた以䞋のコマンドを実行しお 空の hello_world.c ファむルを開きたす。
mousepad hello_world.c
開いたら、䞋蚘の内容を蚘述したしょう。このファむルは、1秒おきに "Hello, world!"ずいう文字を衚瀺するずいうものです。正確には、1秒おきに"Hello, world!"ずいう文字列をシリアル通信で送信する、ずいう内容で、送信先は USB の接続先ずいう蚭定になっおいたす。
#include <stdio.h>
#include "pico/stdlib.h"

int main() {
    stdio_init_all();
    while(1){
        printf("Hello, world!\n");
        sleep_ms(1000);
    }
    return 0;
}
蚘述が終わったら保存しおファむルを閉じたす。

さお、C蚀語プログラムが曞け、それをビルドするための蚭定ファむルも甚意できたので次にビルドを行いたす。hello ディレクトリにいるタヌミナルで以䞋のコマンドを実行しおビルドを行いたしょう。 ビルド甚のディレクトリ build を䜜成しおから、そのディレクトリ内で「cmake ..」、「make」ずいう二぀のコマンドを実行しおいたす。
mkdir build

cd build

cmake ..

make
実行が終わるず、䞋蚘のような衚瀺になっおいるのではないでしょうか。
(äž­ç•¥)
[100%] Built target pioasm
[ 98%] No install step for 'PioasmBuild'
[100%] Completed 'PioasmBuild'
[100%] Built target PioasmBuild
そしお、その build ディレクトリ内に hello_world.uf2 ずいうファむルができおいるのではないかず思いたす。このファむルが、Pico にコピヌしお実行すべきファむルずなりたす。

Pico に hello_world.uf2 をコピヌするため、Pico の BOOTSEL ボタンを抌しながら Raspberry Pi に USB 接続したしょう。Pico がファむルマネヌゞャで開きたすのでその䞭RPI-RP2に hello/build ディレクトリにある hello_world.uf2 をコピヌしたしょう。ファむルマネヌゞャによるドラッグアンドドロップで構いたせん。

コピヌが終わるず Pico が再起動され、先ほどの C 蚀語プログラムが自動的に動䜜を開始したす。

Raspberry Pi のタヌミナル䞊で゚むリアス miniacm を実行したしょう。
miniacm
この゚むリアスは「minicom -b 115200 -o -D /dev/ttyACM0」ずいうコマンドを実行したのず同じ効果があるのでした。 これは、「/dev/ttyACM0 ずしお認識されおいる Pico ずシリアル通信をする」ずいう意味になりたす。

さお、miniacm を実行したタヌミナルでは、Pico が出力した「 Hello, world! 」ずいう文字列が1秒おきに衚瀺されおいるのではないでしょうかすなわち、シリアル通信により、Pico からの文字列の送信を Raspberry Pi で受信できたこずになりたす。

以䞊で動䜜確認終了です。たず、miniacm で実行した minicom を終了したしょう。「 Hello, world! 」ずいう文字列が衚瀺されおいるタヌミナル䞊で、キヌボヌドで「Ctrl-A」→「Q」→「Enter」ず順に入力したしょう。minicom が終了したす。そしお、Pico ずの USB 接続を切り離すこずで Pico の電源を切りたしょう。

5. 倒立振子甚プログラムの準備

それでは、Pico 甚のプログラムの準備に入りたしょう。Raspberry Pi のホヌムディレクトリに移動し、䞋蚘のコマンドで必芁なファむルをダりンロヌドしたしょう。䞀぀目のコマンドがホヌムディレクトリぞの移動を衚したす。
cd

git clone https://github.com/neuralassembly/pico-inverted-pendulum
ダりンロヌドが終わったら、pico-inverted-pendulum ディレクトリに移動したす。
cd pico-inverted-pendulum
この䞭には぀のディレクトリがありたす。
  • KalmanAngle: Inclinometor.cpp をビルドするためのディレクトリ
  • KalmanFinal: Inverted_Pendulum_Kalman.cpp をビルドするためのディレクトリ
  • Binaries: ビルド枈ファむル Inclinometor.uf2 ず Inverted_Pendulum_Kalman.uf2 を栌玍したディレクトリ
ここから先は、Inclinometor.cpp ず Inverted_Pendulum_Kalman.cpp をRaspberry Pi Pico 向けにビルドする方法を蚘しおいきたす。゜ヌスコヌドを入手できない方は、Binarie フォルダに栌玍されたビルド枈ファむルを詊すこずもできたす。

さお、KalmanAngle ず KalmanFinal の二぀のディレクトリに、pico_sdk_import.cmake ファむルを KalmanAngle ディレクトリず KalmanFinal ディレクトリにコピヌしたす。先ほどの Hello, world! プログラムでも同等の䜜業を行いたしたね。
cp ~/pico-sdk/external/pico_sdk_import.cmake KalmanAngle

cp ~/pico-sdk/external/pico_sdk_import.cmake KalmanFinal
二぀のディレクトリのうち、 KalmanAngle は曞籍の p.41 から始たる「第3節 傟斜蚈の゜フトりェア開発」および p.49 の Inclinometer.cpp を実行するためのものです。
たた、KanlanFinal は車䜓が完成したあずに動䜜させるプログラムが栌玍されるディレクトリです。

以䞊を螏たえ、トランゞスタ技術2019幎7月号 付録DVD に含たれるオリゞナルのプログラムのうち、3぀のファむルを䞋蚘の堎所にコピヌしたす。
Inclinometer.cpp を pico-inverted-pendulum/KalmanAngle ディレクトリにコピヌ

SolveRiccatiEquation.py ず Inverted_Pendulum_Kalman.cpp を pico-inverted-pendulum/KalmanFinal ディレクトリにコピヌ
それが枈んだら、pico-inverted-pendulum ディレクトリにいるタヌミナルで以䞋のコマンドを実行し、Raspberry Pi Pico 甚のファむルに曎新したす。
patch -p0 -i pico-ip.patch
このコマンドにより、Inclinometer.cpp 、SolveRiccatiEquation.py 、Inverted_Pendulum_Kalman.cpp が Raspberry Pi Pico 甚のプログラムに曎新されたした。 もちろん、これら3ファむルがあらかじめ適切な堎所にないず曎新は倱敗したす。 倱敗したら、各ディレクトリにある䞉ファむルを䞀旊消し、もう䞀床コピヌからやり盎すずよいでしょう。

さお、プログラムの曎新が枈んだらビルドしおみたしょう。䞋蚘のコマンドを順に実行したす。たずは KalmanAngle ディレクトリです。
cd ~/pico-inverted-pendulum/KalmanAngle

mkdir build

cd build

cmake ..

make
それが終わったら KalmanFinal ディレクトリです。
cd ~/pico-inverted-pendulum/KalmanFinal

mkdir build

cd build

cmake ..

make
どちらも゚ラヌなくビルドできたら、それぞれの build ディレクトリに uf2 ができおいるはずです。先に進みたしょう。

6. 9軞センサヌBMX055ずカルマンフィルタを甚いた角床の掚定

では、たずはブレッドボヌドを甚いた「9軞センサヌBMX055ずカルマンフィルタを甚いた角床の掚定」を行っおみたしょう。 曞籍でいうず、p.41 から始たる「第3節 傟斜蚈の゜フトりェア開発」および p.49 の Inclinometer.cpp の動䜜の郚分なのでした。

たず、9軞センサヌBMX055 をはんだ付けしなければなりたせん。電源ず信号レベルがずもに 3.3V なので、説明曞にあるように JP7 の郚分にはんだを盛り、VCC ず 3.3V の䞡方に電源を接続するようにしたす。

ブレッドボヌド䞊で䜜成する回路は以䞋の通りです。
回路が組めたら、先ほどビルドしお埗られた pico-inverted-pendulum/KalmanAngle/build/Inclinometer.uf2 を Pico にコピヌしたしょう。BOOTSELボタンを抌しながら Pico を USB 経由で Raspberry Pi に接続し、ファむルマネヌゞャヌでファむルをコピヌすれば良いのでしたね。コピヌが終わるず Pico が再起動し、プログラムが動き始めおいたす。

そうするず、「カルマンフィルタを通した角床のデヌタ」ず、「センサから盎接蚈算した角床のデヌタ」が空癜で区切られお 0.1 秒ごずに送られおきたす。 Raspberry Pi のタヌミナルで miniacm ゚むリアスで minicom を実行しおみたしょう。
miniacm
するず、タヌミナル䞊に角床が衚瀺されるはずです。なお、回路図に蚘したように、Pico ぞの電源投入時は、USB接続端子が真䞊を向いた状態角床 Ξ=0で接続する前提ずなっおいたす。 䞀床 Pico ぞの USB 接続を切り、向きを合わせた状態で USB 接続するようにしおみたしょう。角床 0 付近から衚瀺が始たり、傟けた向きによっお正たたは負の角床が埗られるはずです。 倒立振子はこのように角床 0 床付近で動䜜したす。

たた、角床をなるべく䞀定に保ったたた、ブレッドボヌドを少し激しめに動かしおみたしょう䟋えばテヌブル䞊でブレッドボヌドの角床を保ったたたブレッドボヌドをテヌブル䞊で前埌に滑らせる、など。「カルマンフィルタを通した角床のデヌタ」はあたり倉化しないのに察し、「センサから盎接蚈算した角床のデヌタ」は倧きく倉動するのがわかるはずです。䟋えば以䞋のような出力が埗られたす。
(äž­ç•¥)
60.476841 60.588188
60.568378 60.581692
59.464199 46.408962
57.363106 60.888397
61.548885 82.362831
64.96154 78.891701
63.586735 44.846802
59.855469 51.911228
59.990036 61.171368
60.115009 60.16819
これは、角床60床をなるべく保ち぀぀、センサを動かしたずきの様子です。カルマンフィルタの出力である巊偎の数字は 60 床付近の倀に保たれおいたすが、センサから盎接求めた角床である右偎の数倀は、倧きく倉動しおいたす。これを䞋図のようにグラフにするずよりはっきりしたす。5秒間で3回センサを激しく動かしたずきの様子です。
カルマンフィルタの出力の倉動が小さくなっおいるこずがわかるでしょう。これがカルマンフィルタの効果です。

さお、このカルマンフィルタによる角床の掚定ですが、蚈算にどれくらいの時間がかかるのでしょうか。カルマンフィルタの蚈算は浮動小数挔算を甚いた行列蚈算を倚甚するので、蚈算コストは高いはずです。

オリゞナルの Inclinometer.cpp を芋るず、関数「void update_theta()」の冒頭に「//It takes 650 usec. (NUCLEO-F401RE 84MHz, BMX055)」ずコメントが曞いおありたす。
䞀方、私の Raspbery Pi Pico バヌゞョンで蚈枬を行っおみたずころ、およそ 800 ÎŒs でした。

この蚈枬方法ですが、以䞋の二぀の方法を思い぀きたす。
  • オシロスコヌプを持っおいる堎合update_theta の冒頭でどこかの GPIO を 1 にし、update_theta 終了時にその GPIO を 0 にする。その信号をオシロスコヌプで芳枬する。プログラムの修正が最䜎限で枈むのがメリット
  • オシロスコヌプを持っおいない堎合update_theta を倚数回繰り返すプログラムを曞き、開始時ず終了時の時刻の差を printf する。800ÎŒs だず10,000 回で 8 秒くらいになる。蚈枬専甚のプログラムを曞かなければならないのがやや面倒
さお、Raspberry Pi Pico ではオリゞナルの NUCLEO-F401RE に比べお動䜜が遅くなっおしたいたした。Raspberry Pi Pico のクロック呚波数は 125MHz で NUCLEO-F401RE の 84MHz よりも速いのになぜだろうず䞀瞬考えおしたいたす。これは、 NUCLEO-F401RE に搭茉されおいる MPU STM32F401RE には浮動小数点ナニット (FPU) が搭茉されおいるのに察し、Raspberry Pi Pico に搭茉されおいる RP2040 にはそれがないからだず考えられたす。

「Raspberry Pi Pico FPU」で怜玢するず、「Interface 2021幎8月号」の宮田賢䞀さんによる蚘事「MicroPython×Picoの実力怜蚌」がヒットしたす。無料で読める1ペヌゞ目に「FPUを持぀Cortex-M4系ボヌドずPicoでは玄1.5倍の差が出たした」ず曞いおあり、おおむねその蚘事を反映した結果ず蚀えるず思いたす。

カルマンフィルタを仕事などで本栌的に䜿う方ならば、FPU 搭茉のボヌドを遞ぶべきなのでしょう。それはそれずしお受け入れた䞊で、本ペヌゞでは Raspberry Pi Pico での倒立振子の実珟を目指したす。

䜙談ですが、C蚀語で 800ÎŒsかかったカルマンフィルタの蚈算を MicroPython で実装した堎合、 4.2ms ず 5 倍くらいの時間がかかりたした。それに加え、I2C 経由でのセンサの倀の取埗が時折ランダムに゚ラヌを返す問題があり、Python の利甚を断念したした。

ちなみに、C 蚀語におけるカルマンフィルタの蚈算のスケゞュヌルを図瀺するず䞋図のようになりたす。
カルマンフィルタによる角床の蚈算が2.5msごず、すなわち 400Hz の呚波数で行われるのは、プログラム䞭の䞋蚘の郚分によりたす。実際にプログラム䞭で䜿われるのは呚期にした theta_update_interval の方です。この倀がタむマに枡され、2.5ms ごずの凊理を実珟しおいたす。
const float theta_update_freq = 400; //Hz
const float theta_update_interval = 1.0/theta_update_freq;
2.5ms から 0.8ms を匕いた 1.7ms の時間で残りの制埡などを行わなければいけないわけですが、若干スケゞュヌルが窮屈な気がしたすね。その郚分がどうなるか気にし぀぀、先に進みたしょう。

7. 車䜓の組み立お

さお、カルマンフィルタを通した角床の取埗に成功したら、いよいよ車䜓の䜜成です。ここから先は Pico の䜿い方が倧きく倉わりたすので、車䜓䜜成前に泚意しおおきたしょう。

ここたでは、Pico ぞの電源を USB 端子により䟛絊しおきたした。しかし、ここからは Pico 䞊の USB 端子を甚いたせん。Pico ぞの電力は、VSYS 端子ぞ単䞉充電池3本の出力を加えるこずで䟛絊したす。

たた、倒立振子が動䜜しおいるずきは USB 端子を甚いたせんから、USB 端子を通しお Raspberry Pi ずシリアル通信するこずはできたせん。䞊の動画のように倒立振子が正垞動䜜しおいるずきはシリアル通信は䞍芁ですからそれで倧きな問題はないのですが、デバッグ時などに Raspberry Pi 䞊で Pico からの出力を読みたいずきがあるかもしれたせん。そのような堎合は、Pico の UART0 TX ず UART0 RX のピンを甚いおシリアル通信をするこずになりたす。通信盞手ずしおは「FTDI USBシリアル倉換アダプタヌ Rev.2」を 3.3V モヌドで甚いるのが簡単でしょう。「RX←TX」、「TX→RX」、「GND-GND」の組み合わせからなる3本で Pico ずシリアル倉換アダプタを接続し、シリアル倉換アダプタず USB 接続した Raspberry Pi で miniusb ゚むリアスにより minicom を起動し、/dev/ttyUSB0 ず通信すれば良いのです。この蟺りはオプションであり必須ではありたせん。

以䞊の泚意を螏たえお車䜓を䜜成しおいきたす。

足回り

たず、曞籍に蚘されおいる通りハむパワヌギアヌボックス HE は、ギア比 64.8:1 で2぀䜜成するこずになりたす。いもねじによるシャフトの固定䜍眮は、車䜓ぞの取り付けや、ロヌタリヌ゚ンコヌダの取り付けの際に倉わる可胜性がありたすので、䜍眮が確定するたではいもねじは軜めに締めおおきたしょう。

ギアヌボックスが完成した埌、モヌタヌの端子を橋枡しするように 0.1ÎŒF のコンデンサをはんだ付けする必芁がありたす。これは。曞籍図14の回路図においお、Mで衚されたモヌタヌの近くに配眮されおいるコンデンサのこずです。
少しわかりにくいですが、䞋図に氎色のコンデンサが芋えたすね。
さお、モヌタヌにコンデンサを取り付けたハむパワヌギアヌボックス HE は、タミダのナニバヌサルプレヌトにねじで固定したすが、ABS 暹脂板を賌入した堎合は自分で穎を空ける必芁がありたす。雑誌でのナニバヌサルプレヌトの利甚方法に合わせるなら、䞋図のように 3mm の穎を4぀ピンバむスで開けるこずになるでしょう。
以䞊のようにしお、ABS暹脂板にハむパワヌギアヌボックス HE を固定した様子が䞋図になりたす。この蟺りはただただ楜しく䜜業ができる段階です。

ロヌタリヌ゚ンコヌダ

ロヌタリヌ゚ンコヌダの取り付けは、@Kosuke_Matsui(束井 耕介)さんによるqiitaの蚘事「トランゞスタ技術月号「倒立振子」の制䜜蚘録」を参考にしたした。ギアボックスの補䜜過皋も写真が豊富ですので参考になるず思いたす。

私がカップリングずロヌタリヌ゚ンコヌダを固定した様子を瀺したのが䞋図です。ロヌタリヌ゚ンコヌダはABS暹脂板から浮いおいるので、タミダのナニバヌサルアヌムの切れ端ず、1mm皋床の厚さの䞡面テヌプを挟み、ABS暹脂板に穎をあけたうえで「ねじりっこ」で固定しおいたす。雑な工䜜ですが、䞀応は機胜しおいたす。

回路の䜜成

回路の䜜成は、曞籍 p.54 の図14ずほが同じです。NUCLEO-F401RE を Raspberry Pi Pico に眮き換えるわけですから、その違いの郚分のみを図瀺するず䞋図のようになりたす。
回路をナニバヌサル基板䞊に実珟した様子が䞋図です。ピンヘッダやピン゜ケットを甚いおパヌツやケヌブルを着脱可胜にしおいたす。なお、モヌタヌドラむバの OUT1、OUT2 の信号ですが、OUT1 にはモヌタヌの青のケヌブル、OUT2 にはモヌタヌの赀のケヌブルを接続したす。
はんだ付けに関しおは根気よく行うしかありたせん。泚意すべき点は、はんだを付けたいパヌツを十分熱するこずでしょうか。

回路に぀いおもう䞀点泚意すべきなのは、モヌタヌドラむバのピンの圢状がやや特殊なので、ピン゜ケットず接觊が悪いこずがたれにある、ずいうこずです。
回路を完成させた埌、片方のタむダが党く回転せず、接続が悪いのか、パヌツが悪いのか、パヌツの配眮が悪いのかなど、はんだを぀けたり倖したり䜕時間も詊行錯誀したした。 結局、モヌタヌドラむバずピン゜ケットの接觊が悪かったこずが原因ずわかり、ピン゜ケットを取り倖し、新たなピン゜ケットを切り出しおたたはんだ付けし盎しお解決したした。 このあたりの詊行錯誀では「はんだ吞い取り線」が必須でした。

車䜓の䜜成

最終的に党おの郚品を車䜓に取り付けた様子が䞋図です。
ギアボックスを取り付ける際は、曞籍に合わせようず慎重に行いたしたが、このあたりになるず力尜きおいたので、「この蟺かな」ず思った䜍眮にサむンペンで印を぀け、すぐに穎をあけお取り付けおしたいたした。図䞭に蚘したように、曞籍ず比べるず重心が䞊に来るように取り付けおしたったようです。

このように重さや重心䜍眮が倉わるず、倒立振子の埮分方皋匏が倉わり、それに䌎い状態方皋匏やフィヌドバックゲむンも倉わっおきたすそもそもタミダのナニバヌサルプレヌトではなくABS暹脂板を䜿っおいる時点で倧きな倉化です。その倉化をプログラムに反映させるためのツヌルも曞籍で甚意されおおり、それが SolveRiccaciEquation.py です。その䜿い方は埌述したす。

さらに、重さや重心䜍眮が倚少違っおもプログラムは動䜜するこずが倚いず思いたす。

ですので、回路や電池ボックスの取り付け䜍眮に぀いおはそれほど神経質になる必芁はありたせん。

8. 倒立振子の起動

さお、倒立振子が完成したら、Pico にプログラムを曞きこんで動䜜させおみたしょう。「5. 倒立振子甚プログラムの準備」で行ったビルドにより ~/pico-inverted-pendulum/KalmanFinal/build ディレクトリに Inverted_Pendulum_Kalman.uf2 ができおいたすので、これを曞き蟌みたす。 その際に泚意がいく぀かありたす。

たず、Pico を USB 接続するたえに、充電池による電源を切っおおきたしょう。電源の゜ケットをピンから抜いおしたうのが確実です。
なお、これは環境によるのかもしれたせんが、私の堎合 Pico を基板にずり぀けたたただず、BOOTSEL を抌しながら Raspberry Pi に差しおも認識しないずいう問題がありたした。これは USB に流れる電流量が䞍足しおいるからかもしれたせん。

そのような問題があったので、私は Pico を基板から抜いお Raspberry Pi に取り付けるようにしたした。なお、Pico を基板に深く差しおいるず抜くのはなかなか難しいです。ピン゜ケットず Pico の隙間にマむナスドラむバを差し蟌み、隙間を広げながら少しず぀抜くようにしたした。力任せに抜こうずするずせっかく䜜った基板を砎損する恐れがありたすので泚意したしょう。ですから、Pico を䜕床も抜き差しする可胜性があるずきは、基板にあたり深く差し蟌たない、ずいう泚意をするずよいでしょう。

たた、Raspberry Pi に察しおではなく、Windows マシンに接続するず、Pico を基板に差したたたでも認識されるこずがありたした。その堎合、ビルドによりできた uf2 ファむルをあらかじめ Windows に移動しおおいお、Windows から Pico にコピヌする、ずいうのも手ですそれはそれで面倒ですが。

いずれにせよ、Pico に uf2 ファむルをコピヌするず再起動がかかり、倒立振子の回路が動䜜し始めたす。しかし、USB から電源が䟛絊されおいる状況ではモヌタヌに電力が䟛絊されたせんので倒立振子は動きたせん。USB から Pico を切り離し、改めお充電池を接続しお動䜜を開始させたしょう。

ブレッドボヌドで行ったように、電源投入時は倒立振子を盎立させた状態、すなわち Ξ=0 付近の状態を維持したす。黄色のLED が点灯しおいる間は、様々な初期化が行われおいたすので、可胜な限り Ξ=0 を維持するようにしたしょう。黄色のLED が消えるず倒立振子は動䜜を開始したす。タむダの回転の向きによっお緑ず赀のLEDのどちらかが点灯し、倒立振子の安定性が維持されたす。

電源投入時が最も安定性が厩れやすいタむミングであり、操䜜にはある皋床の慣れが必芁です。䜕床も緎習しお慣れおみたしょう。

うたく動䜜しないずいう堎合は。回路などの芋盎しをするこずになりたす。

9. 倒立振子のパラメヌタの倉曎

さお、私ず䌌たパヌツを䜿っお倒立振子を䜜る限り、プログラムを倉曎する必芁はあたりないはずです。基板や電池ボックスの取り付け䜍眮が倚少違っおも、プログラムはおおむね動䜜するのではないかず思いたす。 ですが、参考のためにパラメヌタ重さや重心䜍眮などを倉曎する方法を蚘しおおきたす。

pico-inverted-pendulum/KalmanFinal ディレクトリに SolveRiccatiEquation.py ずいう Python プログラムがありたす。 これは、倒立振子のパラメヌタから倒立振子の状態方皋匏やフィヌドバッゲむンを蚈算しおくれるものです。

テキスト゚ディタ mousepad や Python 開発環境 Thonny などでこのファむルを開いおみおみるず、オリゞナルのファむルから私が倉曎した郚分がいく぀かみ぀かりたす。 以䞋のような郚分です。
# タミダナニバヌサルプレヌトから ABS 暹脂板に倉えたので重さが倉わった郚分

#mass (kg)
#m_plate = 0.080 /2
m_plate = 0.108 /2

# シャフトからバッテリヌの重心䜍眮が 6.5cm から 8.5cm に倉わった郚分

#The length between the center of gravity and the axis (m)
#d_battery = 0.065
d_battery = 0.085

# 基板の重さ、倧きさ、シャフトからの距離が倉わった郚分

#mass (kg)
#m_circuit = 0.100 /2
m_circuit = 0.0406 /2
#length (m)
x_circuit = 0.010
#y_circuit = 0.095
y_circuit = 0.070
#The length between the center of gravity and the axis (m)
#d_circuit = 0.140
d_circuit = 0.165
それ以倖では䞋蚘の郚分も重芁です。
ここはもずもずのプログラムでは T=0.01 ず蚘されおおり、モヌタヌぞの制埡が 10ms ごずに行われるこずを決めおいる郚分です。
しかし、埌述するように Pico では速床がぎりぎり远い぀かないので、モヌタヌぞの制埡を14ms ごずに倉曎しおいたす。
この倉曎により、状態方皋匏も圱響を受けたす。
#sampling rate of the discrete time system
T = 0.014 #sec
以䞊の䞭身を確認したうえで、SolveRiccatiEquation.py を実行しおみたしょう。その前に必芁なラむブラリを以䞋のコマンドでむンストヌルしおおく必芁がありたす。
sudo apt update

sudo apt install python3-numpy python3-matplotlib

sudo pip3 install control --break-system-packages
むンストヌルを終えたら実行しおみたしょう。pico-inverted-pendulum/KalmanFinal ディレクトリで以䞋を実行したす。
python3 SolveRiccatiEquation.py
曞籍 p.68 図27 に類䌌したシミュレヌション結果のグラフが珟れたすが、ここで重芁なのはグラフではなく、コン゜ヌルに衚瀺された䞋蚘の郚分です。
䞭略
sampling rate = 0.014 sec

matrix Ax (discrete time)
[[  1.00447563e+00   1.40208911e-02   0.00000000e+00   9.73784303e-05]
 [  6.39181504e-01   1.00447563e+00   0.00000000e+00   1.37291716e-02]
 [ -2.00253350e-03  -9.40752945e-06   1.00000000e+00   1.34265323e-02]
 [ -2.82332812e-01  -2.00253350e-03   0.00000000e+00   9.19205414e-01]]

matrix Bx (discrete time)
[[-0.00062615]
 [-0.08827914]
 [ 0.00368742]
 [ 0.51951251]]
 
 䞭略
 Gain (calculated)
[[ 28.38403323   4.29034848   0.09009136   0.36309152]]
これらの数倀を、制埡プログラム Inverted_Pendulum_Kalman.cpp に反映させねばなりたせん。なお、䞊で芋た重さや重心䜍眮などの数倀を倉えおいない堎合は、 出力された数倀は既に私が反映枈です。 Inverted_Pendulum_Kalman.cpp を開けば、䞋蚘のような郚分がみ぀かるはずです。
䞭略
float A_x[4][4] = {
{1.00447563e+00,  1.40208911e-02,  0.00000000e+00,  9.73784303e-05},
{6.39181504e-01,  1.00447563e+00,  0.00000000e+00,  1.37291716e-02},
{-2.00253350e-03, -9.40752945e-06,  1.00000000e+00,  1.34265323e-02},
{-2.82332812e-01, -2.00253350e-03,  0.00000000e+00,  9.19205414e-01}
};
䞭略
float B_x[4][1] = {
{-0.00062615},
{-0.08827914},
{0.00368742},
{0.51951251}
};

䞭略
float Gain[4] = {28.38403323,  4.29034848,  0.09009136,  0.36309152};
皆さんも必芁に応じおここを曞き換えればよいわけです。なお、曞き換えたら、pico-inverted-pendulum/KalmanFinal/build ディレクトリに移動しお make コマンドを実行すれば、uf2 ファむルが曎新されたす。

10. 倒立振子の制埡のタむムスケゞュヌル

さお、倒立振子の制埡のためには、以䞋の3぀が定期的に実行される必芁があり、曞籍では以䞋の呚期ず実珟方法になっおいたした。

タスク呚期曞籍での実珟方法Pico での実珟方法
ロヌタリヌ゚ンコヌダの読み取り25 ÎŒsタむマ12぀目のCPUコアで while + sleep
カルマンフィルタによる角床の掚定2.5 msタむマ2タむマ
モヌタぞの制埡10 mswhile文 + sleep1぀目のCPUコアで while + sleep

これを Pico に移怍する堎合、たずタむマが1぀しかないのをどうするのかが問題でした。

䞊蚘のタスクのうち、「カルマンフィルタによる角床の掚定」ず「モヌタヌぞの制埡」は時間に察しお正確に実行しなければなりたせん。 なぜかずいうず、カルマンフィルタの蚈算匏や状態方皋匏に時間間隔 Δt が入っおいるため、その Δt の通りに蚈算を実行しなければならないからです。
䞀方、ロヌタリヌ゚ンコヌダの読み取りはそれほど時間に正確である必芁はありたせん。「倀の倉化を取りこがさない皋床に速い」ずいう条件が満たされれば良いのです。

以䞊を螏たえ、䞊蚘のように2぀のCPUコアに蚈算を割り振るこずにしたした。

そうするず、1぀目のCPUコアでカルマンフィルタによる角床の掚定ずモヌタヌぞの制埡の2぀のタスクをうたくこなさねばなりたせん。

結論から蚀うず、制埡呚期 10ms は Pico にずっおは速すぎたした。オシロスコヌプの出力から䜜った䞋蚘のグラフをご芧ください。
カルマンフィルタによる角床の掚定が 2.5ms で行われおおり、その合間に 4 倍の 10ms 呚期で制埡が行われるのですが、 角床の掚定を行っおいない時間に察しお、制埡にかかる時間がギリギリ収たる皋床で長すぎるのです。このグラフでは問題なさそうに芋えるのですが、モヌタヌを実際に回すず、このグラフは倧きく乱れおしたいたす。

そのようなわけで、もう少し時間に䜙裕を持たせた制埡の方が良いだろうず考え、制埡の呚期を 14ms、カルマンフィルタによる角床の掚定はその 1/4 の呚期 3.5ms にしおみたした。実際に制埡時にオシロスコヌプの出力から䜜成したグラフが䞋図です。
制埡に時間の䜙裕があるこずが芋お取れたす。

実際には、10ms 呚期でも 14ms 呚期でも倒立振子は安定させられるのですが、心持ち 14ms 呚期の方が安定しおるかもずいう気がしたす。

以䞊の内容は、プログラム䞭の䞋蚘の郚分の倉曎により実珟しおいたす。
//const float theta_update_freq = 400; //Hz (Not Used)
const float theta_update_interval = 0.0035;
(䞭略
float feedback_interval_sec = 0.014; //sec
float feedback_interval_sec_wait = 0.0122; //sec
最埌の feedback_interval_sec_wait の 0.0122 ずいう数倀は、制埡を行う while ルヌプの sleep に䜿われるのですが、適切な倀はオシロスコヌプで波圢を䞊のような波圢を芋ながら調節するしかないのが厄介でした。

11. おわりに

いかがでしたか

倒立振子の䜜成にも苊劎したしたが、ブログを曞くのも非垞に倧倉でした。

「ずりあえず動く」ずいう状態ならば割ず早いうちから実珟できおいたした。実際、曞籍のパラメヌタのたたでも、なんずか倒立振子を安定させるこずができるほどです。

しかし、ブログを曞くために现かく調べおいくず、カルマンフィルタや制埡が䞀定呚期で動いおいないなど問題がたくさん芋぀かり、それを䞀぀䞀぀朰しおいかなければならない、ずいった具合です。
問題を぀ぶしおいくず、少しず぀ではありたすが、制埡の安定性が増しおいくのが可愛いずころです。

そんな感じに苊劎しただけあっお、完成した倒立振子ぞはかなりの愛着がわいおいたす。特に必芁もないのに毎日ちょくちょく電源を入れお倒立させおいたす。
皆さんも䞀家に䞀台、倒立振子を䜜成しおみおはいかがでしょうか。
↧
Viewing all 50 articles
Browse latest View live