2021年9月26日日曜日

迷いに迷って DELL G15 5511を購入(Yolo darknetで)

  AIによる画像認識用にDELL G15を購入しました。

Windows10のセットアップからYoLo/darknetのインストール、画像認識の実行までを記します。

0.電源ON

DELL G15キーボード
  ・一瞬 「電源スイッチが 無い!」 と 思いきや、 キーボードの右奥端のキーに電源マーク 、1度そのキーを押してみる。 起動せず、 もう1度押してみる まだ起動せず。 しばらく置いて 数度 押す。するとようやく 画面にDELLのマークの表示。 ようやくセットアップ開始。

==> ノートPCを開くことがSW ON せっかちに電源キーを押したため 電源ON/OFF が意図せずに繰り返しため電源ONにてこずったようです。


1.Window10のセットアップ

  ・ローカルアカウントでセットアップできない! 昨年末 職場でLENOVOの3台のPCをローカルアカウントでセットアップしたのですが、今それが出来ない。一旦マイクロソフトアカウントでセットアップしてからローカルアカウントを作成。 最近のWindows10のアップデートでそうなったのか? DELL固有の話なのか分からない。


2.YoLo/darknetのインストール

    1)ツールのインストール

        ・VisualStudio Communication 2019 のインストール。

        ・CMake 3.21.2 のインストール

            VisualStudioのソリューション/プロジェクトの生成を行います。

            (数多くのパス設定、プリプロセッサ、etc.を行ってくれます。)

        ・Nvidia CUDA11.4.2ToolKit及びCUDNN

     ToolKitのインストール後 CUDNNのダウンロードファイル(cudnn-11.4-windows-x64**.zip)を解凍しbin等のフォルダをCUDA ToolKitのフォルダと統合する。

 2)OpenCVのインストール

   これが一番面倒 

        ・OpenCVをダウロード後 opencv-4.5.3-vc14-vc15.exe を実行(解凍)                 ・CMakeで CUDAを組み込むためのオプションを設定し、Generateを行う。

        ・CMakeで生成されたOpenCVのプロジェクトのビルドを行う。

    3darknetのインストール

   ・GitHubからdarknet をダウンロードする。取得したdarknet-master.zipを解凍する。

        ・CMakeでOpenCVを組み込むためのオプションを設定しGenerateを行う。

        ・CMakeで生成されたdarknetのプロジェクトビルドを行う。

3.YoLo/darknetの実行

darknetをDynabook及びDell G15で稼働
・次のコマンドラインで実行
darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights data/Car.mp4

 Car.mp4はフリー動画をダウンロード






        ・実行結果

        GPU非搭載のDynabookに比べ G15は 画像認識において70~80倍のパフォーマンスを示しました。

Dynabook AVG_FPS は 0.4fps
DELL G15 AGV_FPS は 31.6fps

(上の動画のAVG_FPSは OBS Studio を動画作成に使用したため3割程度低めの値を表示しています。)




2021年7月4日日曜日

妄想鉄道の夜 第1夜 Nゲージ+Arduino

 Arduino(ATMEGA328P)をNゲージに載せてみました。


 電子工作を始めたころから、鉄道模型にマイコン制御を組み込みたいと思っていました。
とりあえず、20年前に購入したNゲージを引っ張り出してSLの走行をためしました。
 最初、レールからの給電がうまくいかず。レールみがきから始めました。

それから3か月ようやくマイコン搭載の車両の走行が実現出来ました。
 

 概要

 Nゲージ車両にはマイコンATMEGA328Pを搭載、コントローラからIRによる指令を受信し、モータードライバを介して、モータを制御し、前進、停止、後退、速度調整を行います。











車両搭載/コントローラ マイコンの選定

 搭載マイコンは Texas InstrumentsのMSP430、Microchip Technology ATMEGA 考えています。 搭載スペースでは MSP430 開発の手軽さでは ATMEGA。とりあえず ATMEAG328Pを選択しました。

 コントローラ用のマイコンも開発の手軽さでArduino Nanoを選択。

Nゲージ車両






※モータドライバ、ATMEAG328P、2200uFコンデンサーの配置がポイント、配置を間違えると、発車、停止、前進後進切替え時にマイコンが暴走、制御不能に、









Nゲージコントローラ

 ※意外と、電動ポイントの駆動に電流が必要なことが判明、1000uF~4700uFのコンデンサに電荷をため込み、一気に放電させることでなんとか 電動ポイントの駆動に成功。
 極性(+/―)の反転用にモータドライバを使用。
 (コンデンサー/モータードライバ間に抵抗を配置して、過電流の防止を試みたが失敗、いろいろやって 2200uF のコンデンサを採用しました。)











マイコンのプログラミング 開発環境

 開発環境はArduinoIDEを使用します。




Arduino IDE は setup()関数で初期処理、Loop()関数で処理の本体を C言語で記述します。








ボードマネージャで 車両搭載マイコン ATMEAG328Pの場合Arduino Unoを選択、コントローラ用のマイコンの場合 Arduino Nano を選択して プログラミングを行います。 
(ターゲット毎に切替えるのは結構面倒)

ATMEAG328Pのプログラミングについて




ATMEAG328Pのプログラミングは、Aruduino UNO R3 自体に 取り外し可能な ATMEAG328P が搭載されているので Arduino Unoとしてプログラミングして、プログラムの書き込み後、UNOから取り外し、Nゲージ車両に搭載します。



 
※ Arduino IDEでのプログラミングで ピン「D9」 を使った場合 ATMEAG328Pでは  PB1 15ピンを使うことになる。





マイコンのプログラミング 実装

 今回のプログラミングの中心は 赤外線通信です。参考のプログラムコードはArduino IDEのスケッチ例から取得しました。

 IR通信 送信側(Nゲージコントローラ側)



Nゲージコントローラ側のプログラミングはスケッチ例/IRemote/IRsendRawDemoを参考にしました。

(※IrSender.sendRaw_P()を使用)

 IR通信 受信側(Nゲージ車両側)

【きむ茶工房ガレージハウス】 ◆ 赤外線リモコンを送信器にして何か動かす記事さんのコードを拝借
  赤外線リモコン受信モジュールの信号の Hi/Low の 間隔を測り 受信データをビットパターンで取得する。


 







2019年11月1日金曜日

LED8x8x8 デモ展示



1. 500個のLED
 今年の4月大阪 日本橋の電子パーツ屋のレジ横に、LEDキューブ(5✖5✖5)の展示が目につきました。ロジックIC等の会計をしている間、青く光る125個のLEDが綺麗に点滅しているのに目を奪われました。過去にCEATEC等の電子デバイスの展示会等で何回も目にしていたとは思うのですが、その時はあまり興味がわきませんでした。なぜかレジ横のLEDキューブが目に付いたのでした。会計を済ませ、店を出る間際、特売ワゴンの中に500個千円の赤LEDを発見、咄嗟にLED8X8X8が作れるかもと思い、それを手にとりレジに逆戻り。

2. 256個のロジックICの妄想
 帰りの電車の中、さてLEDキューブどうやって組み上げるかいろいろ考え、、ほぼ妄想レベル。。。 マイコンとのインターフェイスは XYZの3次元指定とし、8ピン×3 + GND で 25ピン。 LEDのON/OFFはANDのロジックICを2段で、、、と思いつきのままあれやこれやと考え、最終的には、ロジックIC幾つ使うのか、ANDのロジックICは4回路入りなので256個必要になると思い至り、こりゃ無理、絶対無理。帰宅早々 500個のLEDは、ストックBOXに。

3.トラ技5月号 PSoc付録基板 その2
74HC595によるシリアル/パラレルの信号変換の検証に、お題は8✖8のLEDの表示をマイコンの4ピン(SI✖2、RCK、SCK)で実現させること。マイコンは、直近で扱っていたトラ技のPSoc基板を使い。LED8x8は自作(市販で300円程度で買えるのですが、あいにく手元に無かったので)
 まず表示を 行(ROW)/列(COL) 指定で1つのLEDを点灯、これを64回繰り返して1面の表示を考えたが、輝度は1/64で暗く、かなりちらつくと予想されるのでNG、次に列(COL)ごとに8つのLEDを点灯、8列分繰り返しての表示を行うことにしました。
PSocで1列毎の表示データ(8ビット)を1面分8列、これを8面分持たせ8X8の8コマの動画の表示を行いました。






4.LED8x8x8
 さて、LED8x8の表示を実現すると、このLED8x8を8枚重ねれば、諦めていたLEDキューブ(8x8x8)ができると思い。ストックBOXから、半年ぶりに500個のLEDを取り出し、(不足分12は別の赤LED)8枚のLED8x8をはんだ付けで作成これを積み重ねてLEDキューブらしきものが出来上がりました。
 原理は、LED8x8の アノード(+)側 8ビットを64ビットにし LED64✖8 マイコン側のプログラムを 8ビットデータを64ビットに拡張しただけ、原理的には LED8x8とほぼ同じ思考で組み上げました。
 ただ、512個のLED、9個の74HC595、2個の74HC126(カソード側(-)反転用)
と配線のはんだ付けが大変でした。

2019年6月14日金曜日

トラ技PSoc基板をためしました。

トランジスタ技術5月号付録のPSoc基板を入手、この2か月あれやこれやといじっています。今回74HC595によるシリアル/パラレル変換をテストしました。

1.LCDディスプレイ表示
キャラクタLCDディスプレイ(SC1602)表示

キャラクタLCDディスプレイの表示にはPSoc Creatorで提供されるサンプルコードを利用します。










サンプルコード選択

〇プロジェクト新規作成
・プロジェクトテンプレート選択で「Code example」を選択。

・サンプルコード(code example)選択で「Char_LCD_Horizontal_Bar_Graph」を選択。


Bootladableコンポーネント追加

・Bootladableコンポーネントを追加(トラ技 Lチカプロジェクト(LEDBLINK) 参考)





〇このサンプルプロジェクトをビルド後PSoc基板に書き込む。
       ※書き込み後 サンプルプログラムが動き出す。
〇このプロジェクトのデモ表示部を削除して、LDC表示のみを残しベースプロジェクトとします。

2.GPIO割り込みの実装
操作SW用 Digital Input Pin コンポーネント追加
テスト基板の3つの操作スイッチの割り込みを実装します。
〇Digital Input Pinコンポーネントの追加
・Number Of Pinsを3に
・Interruptの設定



〇main.cの編集
・CY_ISR_PROTOマクロを使用してGPIO割り込み関数を宣言
  CY_ISR_PROTO(GPIO_ISR);
・CY_ISRマクロを使用してGPIO割り込み関数を定義
  CY_ISR(GPIO_ISR)
   {
       uint8 InterruptState = SW_ClearInterrupt();
      ・・・・・・・・
             ※InterruptStateにPinのIDが格納
・main()に初期処理を追加
     isr_1_StartEx(GPIO_ISR);  ・・・・GPIO割り込み関数を登録
     CyGlobalIntEnable;     ・・・・・割り込みを許可

3.74HC595のテスト
今回は、74HC595(シリアル/パラレル変換)のテストを行った。
74HC595テスト構成


・操作スイッチSW1~3でLEDの点灯パターンを切り替え。
・PSoc4100S ==> 74HC595 はシリアル。
・74HC126は今回のテストでは不要
(ほぼ無意味)
・PSoc4100S<==>LCDキャラクタLCDディスプレイの接続はP0をP2に変更
   






74HC595テスト




















※※※※※main.c※※※※※※

#include
#include

/* The LCD format in characters */
#define LCD_ROWS                (2u)
#define LCD_COLUMNS             (16u)

/* The delay between displaying bar graphs */
#define BARGRAPH_DELAY_MS       (15u)

CY_ISR_PROTO(GPIO_ISR);

int iPtn = 0;

void fnc_595(int ic){
    int i;
    int j;
    int k;
    k = 128;
    j = ic;
    RCK_Write(0);
    for(i=0;i<8 i="" p="">        if( k & j){
            SI_Write(1);
        } else {
            SI_Write(0);
        }
        SCK_Write(1);   
        CyDelay(10u);
        SCK_Write(0);
        k = k >> 1;
    }
    RCK_Write(1);
return;
}

int main()
{
    int idat = 1;
   
    /* Start the LCD */
    LCD_Start();

    /* Show the demo start message */
    LCD_Position(0u, 0u);
    LCD_PrintString("Test 74HC595");
    LCD_Position(1u, 0u);
    LCD_PrintString("#####05######");
    SI_Write(0);
    RCK_Write(0);
    SCK_Write(0);
    CyDelay(1000u);

    isr_1_StartEx(GPIO_ISR);
    CyGlobalIntEnable;
   
    for(;;)
    {
        if(iPtn == 0){
            idat++;
        }else if(iPtn ==1){
            if(idat == 0) idat = 1;
            else idat = idat << 1;
        }else if(iPtn ==2){
            if(idat == 0) idat = 128;
            else idat = idat >> 1;
            }
        idat = idat & 0xFF;
        fnc_595(idat);
        CyDelay(100u);
    }
}

CY_ISR(GPIO_ISR)
{
    uint8 InterruptState = SW_ClearInterrupt();
    char cbuff[8];
   
    itoa(InterruptState,cbuff,10);
   
    LCD_Position(1u, 0u);
   
    if (InterruptState == 1){
      LCD_PrintString("##Key1##");
       iPtn =0;

    }else if (InterruptState == 2){
     LCD_PrintString("##Key2##");
       iPtn =1;
 
    }else if (InterruptState == 4){
      LCD_PrintString("##Key3##"); 
       iPtn =2;
 
    }else {
      LCD_PrintString("##KeyX##");
   }
     LCD_Position(1u, 9u);
     LCD_PrintString(cbuff);
}
※※※※※※※※※※※※※※※※※※

GPIO割り込み時の押されたスイッチの識別は
 uint8 InterruptState = SW_ClearInterrupt();
の InterruptState  に格納される値で行いました。
Digital Input PinコンポーネントのSWのピンIDで
SW[0]の場合 1
SW[1]の場合 2
SW[2]の場合 4  となるようです。





2018年7月6日金曜日

Dynabook分解修理


 ◎昨年暮れ、電車の網棚からDynabook AZ85/UG が落下。
電車の網棚に置いたバックを下ろそうとしたところ、ちょっと何か引っかかる感覚があり、強引にバックの持ち手を引っ張ったところ、バックの勢いに、持ち手を放してしまい、バックは勢いよく床に落下、バックのDynabookを確認したところ、右のヒンジの付近が大破、電源のスイッチも浮き上がり押しても無反応、ああああああああ!
 帰宅後、「とりあえず、ハードディスクだけでも無事であってくれ!」 と思いながら、クラッシュDynabookを分解、筐体の損傷は激しいものの、マザーボードは奇跡的無事、そこで、分解途中で、電源スイッチ(内部 基板上)を押すと、いつもの通り起動、不幸中の幸い、しかし依然として、普段の使用には耐えない状態、何とかして、筐体を入手出来ないかと。。。
 

 ◎ヤフオク
  筐体入手に、Dynabookのジャンク品が無いかとヤフオクを検索、筐体だけ必要なので(メモリ、ハードディスク、LCDディスプレイなどは不要) 予算5000円前後で「Dynabook AZ」でジャンク品を探すのですが、AZシリーズ自体出品数が少なく、なかなか予算内で落札できず、3か月経過、そんな時、秋葉原でノートPC のジャンク品を漁っていた時(Dynabookのジャンク品はほとんど1世代より古い型ばかりで)、中古ノートPC売り場で、同じ筐体のものがあるのを見つける、はじめ AZシリーズの下位モデルと思いきや、「Dynabook T55」 あれれ!
そこで、ヤフオクの検索条件に Tシリーズを追加、一気に対象が増えました、しかし依然として、落札に至らず。
苦節6か月ようやく、Dynabook T45 ジャンク品を落札、届いたT45を確かめると、美品、筐体損傷なし、メモリなし、ハードディスクなし、送料込みで7300円、


 
◎T45にAG85を移植
 一抹の不安を持ちながら、移植開始、
・両方の筐体を開く、まずマザーボードを確認、基板は同じ(乗っかっているパーツは結構異なっていました。)。
・AZ85のメモリ、ハードディスクを外す。
ここからはAZ85、T45平行して作業を行う。
・光学ドライブを外す。
・マザーボードに繋がっているフラットケーブルを外す(同じフラットケーブルでもコネクタのロックが異なっているものがある、要注意)。
・マザーボードのCPUクーラーを外す。固定のねじを外し、マザーボードを外す。
 ・LCDディスプレイ部を外す。
 ・その他のパーツを筐体から外す。
 ・取り外したAZ85のパーツをT45の筐体に取り付ける。


◎復活 Dynabook
 ・T45に電源アダプタをつなげスイッチON 無事起動(まずは念のため、最初はバッテリーパックを外した状態)


◎バッテリーパックの装着
バッテリーパックがT45とAZ85で共通かどうか不明、いろいろ調べると、ヤフーショッピング等で購入できるDynabookのバッテリーパックの対応機種のリストにT45の記載があるもののAZ85は無い、注意書きに「型式が異なる場合、極性等が異なる場合があるので、他の型式のPCへの流用は行わない」との記載 覚悟を決めて、T45のバッテリーパックを装着、スイッチON、バッテリーパックの異常発熱等が無いか確かめながら、復活Dynabookの機能の確認をおこないました、最初バッテリーの状態を画面で確認すると、バッテリーが認識されていない表示、やはりだめかと思いながら十数分放置、すると充電が10%の表示、最終的に100%の充電が確認できました。


◎まとめ
 今までデスクトップPC、オフコン、EWS等の分解修理の経験(十数年まえ)はあったのですが、初のノートPCの分解で当初不安で、ヤフオクであまり高額のジャンク品には手が出ませんでした。実際にDynabookの分解を始めると、筐体の開きやフラットケーブルの扱いに若干手間取るものの、デスクトップPCの分解修理と大差無いことが実感されました。今思えば、ヤフオクでもう少し頑張れば、、、、6か月かけての復活は少々時間を無駄にした感が否めません。


2017年12月10日日曜日

IOT事始め その2

 前回に引き続き、Texas Instruments のマイコン RM57 Launch Padを利用してIOTの実現を試みた内容を忘備録的に述べます。
 前回のデモプログラムでは ただRM57が抱えている、固定のHTTPファイルを単にWebブラウザに配信するだけで物足りなさを感じていました。RM57の処理した結果をHTTPファイルに反映させる必要があると考えました。まず、デモプログラムのファイルシステム(fsdata)にある、index.htmlを書き換えることで、動的なHTTPファイルを実現出来ないかと考えました。
 ソースとなるHTMLファイルに書き換え領域を示すタグを仕込み、その領域をRM57で処理した結果で書き換えれば、多少の制約があるが程々のものができるのではないか、しかしデモプログラムのソースをチェックすると。fs.cにfs_read()はあるけれど、fs_write()がありません。安直にfs_read()でindex.htmlを読み込み、タグをRX57のプログラムで適当に編集した文字列で置き換え、fs_write()でこのファイルを更新してしまえば、当初のIOTの実現が達成されるのではと。。。
 そうなると、ファイルシステム(fsdata)を動的なものに置き換える必要があります。以前、SDカードの読み込みをRM57で試していましたが、なかなかうまくいかず挫折していましたが、今回再度挑戦、、、長期戦を決断しました。

 ファイルシステムをSDカードのファイルシステム FatFs に置き換えることで動的なファイルシステムを実装することにしました。

 RM57は、豊富ペリフェラルを持ちSDメモリーカードに使用するSPIも単独で使用することができました。
 後はひたすら、httpd.cの fs_read(),fs_open()を FatFsのf_read(),f_open()に置き換えることで生じる膨大なビルドエラーに対応しました。
 あと、#define で LWIP_HTTPD_DYNAMIC_FILE_READ 、LWIP_HTTPD_DYNAMIC_FILE_READ を定義する必要があります。
  

 なんとか、SDカードにあるHTMLファイルが Webブラウザに表示できるようになりました。 すると今度はWebブラウザからRM57を制御したくなりました。
 今から十数年まえ、NetscapeのWebサーバでCGIを使っていた事を思い出すと、httpd.cのコメントにCGIの記載があることに気が付きました。
 
 今度はCGIの実装に挑戦です。 


 このプログラムはWebブラウザで入力されたRGBの色の値をRM57に送り、LCDディスプレイにその色で描画するといったものですが。自己満足は十分に満たしたものとなっています。
  

  

2017年6月21日水曜日

IoT事始め

 遅ればせながら、IoTを体験したいと思い、Texas Instruments LaunchPad(LAUNCHXL2-RM57L) の デモアプリケーションを試してみました。

 このデモアプリケーションでは、HTTPDの機能、DHCPからのIPアドレスの取得、シリアル通信によるログ出力が実現されています。

○デモアプリケーション(開発環境、ソースコード)を TI Wikiよりダウンロード。


 ※(http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM57L:_lwIP_Demo)


○開発環境の整備
 ・Code Composer Studio(CCS)は  Version: 6.2.0.00050 にアップデート
 ・HALCoGen  は Window10で一部の画面表示が乱れるので、Windows7 で インストール(アップデート)を行いました。(Window10で一部の画面表示が乱れはかなり少なくなっていますが、まだ使用には耐えられないようです。)
○デモアプリのダウンロード
 ・デモアプリをダウンロードし展開
(フォルダ「HALCoGen EMAC Driver with lwIP Demonstration\v00.03.00¥」に実行ファイル、ソースコードが展開されます。)
(HALCoGenのサブパッケージもインストールされるようです。前述のアップデートは不要かも?ここでアップデートも行われるかも?)
○HALCoGen によるRM57のコンフィグレーション
 ・GIO、SCI1、MIIおよびPINMUXの設定を行いました。ただひたすら、Wikiの説明通りの修正作業となりました。
   (from MII_RX_AVCLK4 to MII_RXCLK....の記述がいまいち不明で balls T4, U7 のMII_RXCLK、 MII_TX_CLKを選択。)
 ・RM57Lのコンフィグレーションソースの生成
○CCSによるデモアプリの生成
 ・Wikiの説明通りプロジェクトのインポート、コピーを行う。
 ・HALCoGenの生成ソースコードへのリンクを行う。
 ・HL_phy_dp83640.h、HL_sys_main.cを修正する。
○XDS110 Emulator設定
 ・targetConfigsフォルダのRM57L8xx.ccxmlの修正
   「RM57L8xx_0」を「RM57L8xx」に、「XDS110 USB Debug Probe_0」を「XDS110 USB Debug Probe」に修正。
○デバッグ実行
 ・ターミナルソフトをCOM3、9600BPSで立ち上げ実行


※LAUNCHXL2-RM57Lはネットに接続していないのでDHCPからのIPアドレス取得エラーが表示されているが、一応稼働しているらしい。






○ちょっと修正

 最初、LauchPadへの接続が不調で、過去に作成した、RM57Lプロジェクトにこのデモアプリケーションのソースを組み込み。なんとか、IoTの実現の第一歩にたどりついた様子を掲載します。



※今回のデモアプリケーションにBOOSTXL-K350QVGへの表示機能を追加したアプリケーション。














※ルータにLaunchPadを接続して、デバック実行
 DHCPによるIPアドレスの取得に成功している。








※WebブラウザでLauchPadにアクセスする。

表示されている内容は、Cのソースコードに変換して、プログラムで定義されたデータの形で扱われている。(固定の表示)








◇コンパイルエラーが多少出る。
 ・HL_pinmux.c の pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_ | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2; でコンパイルエラー
 対処:PINMUX_BALL_R4_を削る。  など

◇Launch Padのパッケージを開封した際、MACアドレスが同封されていることを期待していたのですが、、、、残念、古い古い、ノートPC(Win95)のEtherNetカードのMACアドレスを流用しようと思います。(ローカルで使う分には、何を使おうが関係ないのですが。。。。)


◇今後は、RM57Lとのデータやパラメータの送受信が HTTPDを介して 実現できたらと思います。























2015年8月28日金曜日

LaunchPad ブースターパック(TFT液晶)を試しました。 その2

MSP432 LaunchPad 用の BoosterPack を RM46x LaunchPad に 試してみました。

これらのLaunchPadは、BooserPackに使用するピンヘッダーの機能が共通なので、LM4F120 LaunchPad のように ピンの変換を行う必要はありません。
 ただ、BooserPack BOOSTXL-K350QVG-S1 に RM46用のサンプルが無いだけだと思います。

 とりあえず、画面表示に挑戦してみました。

ポイントは、
 ・SPI 機能は MibSPI3 モジュール を使用 
   ただし動作モードはSPIモード(MibSPIモードでは行わない。)
 ・GPIO 機能は 少々面倒
  SPI CS ピンは直接 GPIO(GIO)を使えません。
  High-End Timer (N2HET) モジュールのGIO機能を使う。
 ・HALCoGenに慣れること。






HALCoGenの設定

 SPIの設定 
*MIBSPI3とSPI3は同じモジュール(としてあつかう。?)

  SPIの設定2
*DataFormat 0 を設定。
*ボーレートを16MHzで設定
*ClockPolarityをチェック
(SPI MASTERとなる。)

  ピン設定
*SPI SIMO CLKのピン設定





 










SPI コーディング

   spiDAT1_t dataconfig_t;
   uint32 blocksize;

   //  DataFormat 0 を指定
   dataconfig_t.DFSEL = SPI_FMT_0;

   dataconfig_t.CS_HOLD = true;
   dataconfig_t.WDEL = false;
   dataconfig_t.CSNR = 0;

   blocksize = 1;

・・・・・・・・・
   uint8_t dat;

・・・・・・・・・
   //SPI 出力
   uint16  srcbuff[8];
   srcbuff[0] = dat;
   spiTransmitData(spibase,&dataconfig_t,blocksize,srcbuff);


高性能 LaunchPad を試しました。

 
MCUのクロックスピードが220MHz、FlashROM 1.25MB RAM 192KB デジキーで購入できる最高スペックのLaunchPad(2015年8月時点) を購入しました。

 届いたLaunchPadを開封すると、MSP430に比べ小さいパッケージに、どでかいボード(MSP430の2.5倍)が窮屈そうに入っていました。
 早々、にUSBケーブルでPCにつなぐと2つのLEDが異なった周期点滅。
 以下の操作でLEDの点滅が変化


 ・LightSensor を指で 隠すと LED B の点滅が遅くなる。 
 ・UserSW Aを押すと、 LED Aの点滅が早くなる。
 ・Baud Rate: 19200, Data Bits: 8, Stop Bits: 2 and Parity: None. でターミナルソフトにつなぐと、ガイダンスが出力される。

 次に、LED チカチカの もっとも簡単なプログラムを作成にトライしました。(いきなり)
・Code Composer Studio(CCS)でワークグループを作成し、プロジェクトの新規作成を。
 => Target の
 => 再度 CCSをインストールし直す。(結果同じ)  

・http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM46:_Project_0 を 参考にする。
 =>RM46 対応の Target Configuration File を作成する。(プロジェクト作成の前。)
 =>HAL Code Generator を インストール
 =>サンプル Project0を 作成  ここで、Taget の 個別のMCUの選択リストにRM46があることに気づく。




 
 
 






Hercules RM46x LaunchPad の 感想

・IO ピンが多い、ほぼすべてのMPUのピンが利用可能。
・サンプル(デモ)プログラムがほとんど無い。 
  CCSプロジェクトファイル、プログラムソースに加え、HALCoCen. プロジェクトファイルがそろった、サンプルプログラムが提供れる事を期待。
・sys_main.c が 邪魔。 システム、各ペリフェラルのパラメータを HALCoCen. で 修正するたびに sys_main.cが出力 main.cと かぶり 邪魔になります。
・デジキーの価格設定が高い。TI ではほぼ20ドル が 4、721円 Hercules RM57L LaunchPadの価格では?と 。。。。





  
   

2015年8月21日金曜日

LaunchPad ブースターパック(TFT液晶)を試しました。

 MSP432 LaunchPad 対応のBoosterPack (BOOSTXL-K350QVG-S1 Kentec QVGA Display)を購入しました。
早速、MSP432に搭載、デモアプリ BOOSTXL-K350QVG-S1_GrlibExample_MSP432P401R を試しました。

このデモアプリ
 最初 4隅に赤○の表示、これを 順にタッチして、メインメニューが表示、ボタン選択で、テストグラフィックの表示、TIロゴの表示を行います。

さて、このブースターパック、過去に悪戦苦闘して、TFT液晶を表示させてきた事を思い起こすと、結構すぐれもののアイテムだと気付きました。

 今まで、TFT液晶表示を行おうとすると、TFT液晶のフレキケーブルの扱い、バックライトLEDの昇圧回路の作成等、手間暇とコストが結構かかりました。(特に実体顕微鏡での半田づけが大変)
 このBoosterPack、TFT液晶の入出力IFは 2.52mmの2×10のピンフレーム(ソケット)が2個、タッチパネル付き、それが、デジキーで3500円前後 正に理想的なアイテムです。

そこでBoosterPackを 単にTFT液晶モジュールとして試しました。
 デモアプリを CCSで LM4F120XL 用に修正し デバッグ開始、するとタッチパネル キャリブレーション画面の表示後、メインメニューが表示されました。

 (ただ現時点では、タッチパネルの扱いが不調で、キャリブレーション画面のチェックはスルーしてしまいます。)


 <<MSP432 => LM4120XLの変更点>>
 ・SPI  UCB0 => SSI0
 ・ADC 14Bit ADC(A13,A14) ⇒ 12Bit ADC(AIN1,AIN2)  ※
 ・GPIO(SDC) P4.6 => PD3
   ・・・・・・・・・・・・・・・・・・・・・・・・

  ※ADC関連のパラメータは 1/4 に(適宜)

 

黒のLaunchPad(MSP432)を試しました。

 TIのサイトをチェックしていたら。MSP432なるMCUがリリースされているのに気付きました。
手軽に使えたMSP430の32ビット版 勝手知ったる ARM Cortex-Mシリーズ (ARM® Cortex®-M4F)    さらに、LauchPadがデジキーで購入可能。早速購入、デモアプリを試しました。

 開発環境のCCS ver.6.1も問題無く導入完了(TIの場合、開発環境のダウンロードで一旦メールを受け取らなければいけない。これを忘れると。TIのサイト内で堂々巡りをすることになります。今回同じメールを3通受け取りました。。。。)

 デモアプリは、PCのGUIアプリの操作で点滅LED(LED2)の色、点滅間隔を変化させます。
(PC GUIアプリで R:0 G:0 B:140 を指定、LauchPadのLED2点滅を青に、)


そのほか、
 ・UART機能 
    LauchPad(MSP430)経由で確認 
 ・Stellaris LM4F120XL プログラムの移植
    グラフィク液晶表示(SG12864)の移植
       ==>成功
    SDカード読み込みの移植(SPI機能)
       ==>目下のところ不調


MSP432の使い勝手は普通!!・・・・まだ、簡単なテストプログラム段階ですが、何の違和感も無く、プログラム開発が出来ました。







2013年3月11日月曜日

LaunchPad UART,UART,UART,,,,

 Texas Instruments MSP430G2553のUART機能を試しました。しかし、ほんの些細なことに気付けず、お手上げ一歩手前、結構手こずりました。
 以下に、その顛末を記します。
 
UART機能を使う場合、Tx/Rxをクロス配線
1.Software UARTの検証
 もともと、MSP430LaunchPadには、UART機能の無い、MSP430G2231が付属していてデモプログラムはPCとの間でSoftUARTによる通信を実現していました。
 そこで、MCUをUART機能を持つMSP430G2553に置き換え、Software UARTを試すことにしました。
 1)CCS Ver4で新規プロジェクトを作成、
 作成時のProject Templatesで [Grace Examples/Hello world via software UART]を選択
 2)実行(Debug)
PCのターミナルソフト(ボーレート2400)で「Hello world.」を確認
2.UART機能の検証
 まずは、送信(TX)のみのプロジェクトを作成。
 1)新規プロジェクトを作成。
 作成時のProject Templatesで[Empty MSP430 Grace Project]を選択
 2)GraceでUART機能を設定
Grece Device OverViewで[USCI  A0 UART...]を選び、UARTの端子設定、ボーレート設定を行いました。
3)実行(Debug)
software UARTと同様にPCのターミナルソフトでMSP430からの通信を待つが音沙汰なし。
4)試行錯誤
 まず、P1.1、P1.2のピンの設定に問題があると思い、GraceでGPIOの設定を先に、その後UART設定を行う。Graceでの設定と、src/csl/GPIO_init.c等のソースコードの内容に祖語があると思いジタバタ、(プロジェクトのビルドでGraceの設定内容がソースコードに反映されることに気付くのは結構経ってから)
 UARTのボーレートが正しく設定されていないと思い、Basic Clock System(BCS)の設定を1、8、12、16MHzで試す
  等々、試行錯誤を繰り返す。

3.「え! こんなことが。。。」
 試行錯誤を散々繰り返した、もう、MSP430のUART機能はデータシートだけの機能とあきらめ、BaseBoadを作成、一応、UARTの入出力Pinを用意、LCD表示を確かめた後、だめ元で、UART機能をBaseBoad上で試す。すると、PCのターミナルソフトに「Hello world.」の表示が、、「え! なんで」と言う気持ちになりました。
   
 そこで、BaseBoad上のMSP430をLaunchPadに戻して、UARTの通信を確かめると、沈黙
Stellaris-MSP430 UART
つくづくLanchPadを眺めると、P1.1(TXD)、P1,2(RXD)の表記に目が留まりました。
「うそ!TX/RX 逆じゃないか!!」
つまり、LaunchPad MSP430 デモプログラムのSoftwareUARTのTX/RXピン構成が、MSP430G2553のUARTのTX/RXピン構成と逆になっているということです。
そこで、LaunchPad上のTX/RX配線をクロスさせ、試行錯誤で作成したプログラムを試すと殆どがUARTの機能が実現されていたことを確認しました。


4.Stallaris UART
 Stallaris LM4F120 のUART機能はさほどの苦労もなく試すことが出来ました。試したプログラムは SDカードのテキストファイルを読み込み、1行ごとにUART出力、これをMSP430で受けてLCD表示するといったものです。


Memo
1.MSP430のUART 受信(RX)は1バイト毎のRX割り込みで取り込み。
初め、RX(UCA0RXIFG)割り込みフラグクリアまで受信データを取り込む形で試しました。すると、受信データの最後の1バイトのみ取り込んだ結果になりました。
そこで、いろいろ試しているうちに、受信データのバイト数分RX割り込みが発生することがわかり、割り込み毎に1バイトづつ取り込むように修正、あとは、受信データの終わりの認識方法をどうするか、、、タイマを使い周期的に受信バイト数の監視を行い、増減なしで受信完了の処理を行うようにしました。