2020年5月25日月曜日

PIMORONIのPirate Radio インターネットラジオ

コロナ禍の影響でテレワークが続いています。20200525
テレワークのBGM用に前々から気になっていた、PIMORONIのPirate RadioSwitchScienceさんで見つけて、購入してしまいました。



これは、Raspberry Pi Zero W を使ったインターネットラジオの組み立てキットになります。 キットの中には必要なものはほぼ全て入っており、他に必要なものは、セットアップに使うHDMIディスプレイ、HDMIケーブル、USBキーボードです。

組み立てには、Pi zeroW のピンヘッダのはんだ付けげ必要ですが部品点数も少なく、
こちらの組み立て手順に従って簡単にできました。

アプリのセットアップは、ちょっと手古摺りました。
こちらのインストールのドキュメントでは、最新のRaspbian Lite OSをインストールするように記載がありますが、しかしながら現時点(2020-05-24)で最新のRaspbian Lite(Buster)では、internet radio (curl https://get.pimoroni.com/vlcradio | bash) のインストールが失敗してしまいます。

ネットで調べて、こちらのサイトからたどって、過去のRaspbian Liteイメージの置き場から、Debian 9 Stretchの最後のバージョンを入手し、イメージをSDカードに書き込んでStretch OSをインストールしたら、vlcradioのインストールも無事にできました。


このラジオ、電源を繋ぐだけでログインの必要なくインターネットラジオが動き始めますので、普通のラジオ感覚で使用する事ができます。 終了する時は本来ならば、haltしなければならないと思うのですが、面倒なので電源をoffして終了しています。 もしシステムが壊れてしまったならば再インストールするつもりです。

裏側は装置がむき出しですが、なかなかカワイイやすなので満足しています。









2020年5月18日月曜日

PIC32MX DMA転送サンプル "文字列" ⇒UART2 TX へDMA転送

DMA転送のサンプルです。
文字列 "Hello World!" を UART2 TX レジスタへ1バイトずつDMA転送します。
転送のトリガーは TMR5 の割り込み発生です。
また、メッセージデータを半分まで転送したら LED2をONにし、全メッセージを転送終えたら、LED2をOFFします。 これはDMAチャンネル1の割り込みで処理します。
全てのメッセージを転送(ブロック転送)終えたら、再度転送を再開します。


const BYTE bMsg_DMA[] = {
    "Hello World!\r\n" 
};


void vDMA_Test_SettingAndStart (

)
{
    //DMA Channel 1 settings
    DCH1CON = 0x0000; // DMA Channel 1 disabled
    DMA_SourceAddressSet(DMA_CHANNEL_1, (uint32_t)&bMsg_DMA);
    DMA_SourceSizeSet(DMA_CHANNEL_1, sizeof(bMsg_DMA));
    DMA_DestinationAddressSet(DMA_CHANNEL_1,(uint32_t)&U2TXREG );
    DMA_DestinationSizeSet(DMA_CHANNEL_1,1 );
    DCH1ECON = (_TIMER_5_IRQ << _DCH1ECON_CHSIRQ_POSITION ) | ( 1 << _DCH1ECON_SIRQEN_POSITION); // Trigger on TMR5 interrupt
   
    // CHSDIF All source data transfer  finished.
    // CHSHIF 1/2 of source data transfer finished.
    DCH1INT =  ( 1 << _DCH1INT_CHSDIE_POSITION) | ( 1 << _DCH1INT_CHSHIE_POSITION);  // DMA interrupt setting
   
    // CHEN:1=Enable channel
    // CHAEN:1=Keep channel auto enable after block transfer completes
    DCH1CON =  ( 1 << _DCH1CON_CHEN_POSITION) | ( 1 << _DCH1CON_CHAEN_POSITION);  // DMA START with Repeat
}


void vDMA_Test_InterruptCheck (

)
{
    if (DCH1INTbits.CHSDIF == 1)    // All source data transfer  finished.
    {
        LED2_SetLow();
        DCH1INTbits.CHSDIF = 0;
    }
    if (DCH1INTbits.CHSHIF == 1)     // 1/2 of source data transfer finished.
    {
        LED2_SetHigh();
        DCH1INTbits.CHSHIF = 0;
    }
   
}


 MCC settings  

DMA Channel 1 setting

TMR5 setting

Interrupt Setting



実行結果


参考情報
セクション31. DMA コントローラ
PIC32のDMA機能を使ったLEDディスプレイ表示実験


KT0913 FMラジオの作成(8) 出来上がったPCB基板にミスあり。

  FusionPCB から基板がとどきました。20240121. 1月11日に発注したので10日で出来上がって届きました。 早速組み立てましたがが、イヤホンジャックのフットプリントが裏返っており、痛恨のミス。。。 しかしながら、他にも問題が無いか一通り組み立ててチェックしました...