tag:blogger.com,1999:blog-4501164244628750912024-03-13T12:47:57.076+09:00white cloudswhite cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.comBlogger91125tag:blogger.com,1999:blog-450116424462875091.post-64993314887139868092021-10-15T11:40:00.001+09:002021-10-15T12:06:14.441+09:00VC++ デバイス情報の取得<p> 現在、Yolo(darknet)による画像(物体)認識にトライしています。</p><p>ようやく、USBカメラ映像に対する処理プログラムの切り出しに目途が立ったところです。</p><p>そこで、プログラム内部で、PCに接続したカメラを特定し、そのカメラ映像を処理するようにしたいと思ったのですが、私にとって結構な難題であったので、以下にその手法について述べます。</p><p><br /></p><p></p><p class="MsoNormal"><span style="font-size: 14pt;">デバイスリスト表示プログラムの作成<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal">◎プロジェクトプロパティの設定<span lang="EN-US"><o:p></o:p></span></p>
<div style="text-align: left;"><span style="font-size: x-small;"><span lang="EN-US"> </span>〇<span lang="EN-US">C/C++</span>/プリプロセッサ <span lang="EN-US"><span style="mso-tab-count: 1;"> </span><b>INITGUID</b><br /><o:p></o:p></span><span lang="EN-US"><span style="mso-tab-count: 1;"> </span></span>〇<span lang="EN-US">C/C++</span>/詳細設定/「指定の警告を無効にする。」<span lang="EN-US"><span style="mso-tab-count: 1;"> </span><b>4996</b><br /><o:p></o:p></span><span lang="EN-US"><span style="mso-tab-count: 1;"> </span></span>〇リンカー/入力<span lang="EN-US"><span style="mso-tab-count: 1;"> </span><b>s<a name="_Hlk85020777">etupapi.lib</a></b></span><span style="mso-bookmark: _Hlk85020777;"></span> </span></div>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span>◎コーディング</p><p class="MsoNormal"><span style="font-size: small;"> </span><span style="font-size: small;"> </span><span style="font-size: small;"> </span><span style="font-size: small;">〇インクルードファイル指定 <b>setupapi.h、devguid.h 、devpkey.h</b></span></p><p class="MsoNormal"><span style="font-size: small;"><span> </span><span> </span><span> </span>〇使用関数 <b>SetupDiGetClassDevs、SetupDiEnumDeviceInfo、SetupDiGetDeviceProperty</b></span></p>
<p class="MsoNormal">◎デバイス情報の取得 <span lang="EN-US"><o:p></o:p></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-l4SvBLtaosk/YWjYwggiRlI/AAAAAAAABh0/r9r3cL1jdCERkalYFtMk248eCzSvBKBhwCLcBGAsYHQ/s1488/%25E3%2583%2587%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25B9%25E6%2583%2585%25E5%25A0%25B1%25E8%25A1%25A8%25E7%25A4%25BA.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="775" data-original-width="1488" height="334" src="https://1.bp.blogspot.com/-l4SvBLtaosk/YWjYwggiRlI/AAAAAAAABh0/r9r3cL1jdCERkalYFtMk248eCzSvBKBhwCLcBGAsYHQ/w640-h334/%25E3%2583%2587%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25B9%25E6%2583%2585%25E5%25A0%25B1%25E8%25A1%25A8%25E7%25A4%25BA.png" width="640" /></a></div><p></p><p></p><p class="MsoNormal"> <span style="font-size: x-small;"> </span><span style="font-size: x-small;">〇クラスGUID は devguid.h で定義されています。</span></p><p></p><p class="MsoNormal"><span style="font-size: x-small;"><span> </span>〇要求する情報の種別は devpkey.h で定義で定義されています。</span></p><p class="MsoNormal"><span style="font-size: x-small;"><br /></span></p><p class="MsoNormal"><span style="font-size: x-small;"><span> 〇プログラムソース</span><br /></span></p><p class="MsoNormal"><span style="font-size: x-small;"><span> 以下はデバイス情報取得用のテストコードです。</span></span></p><div style="text-align: left;"><span><span style="font-size: xx-small;">/******************************************/</span></span></div><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">#include <iostream></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">#include <windows.h></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">#include <setupapi.h></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">#include <devguid.h></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">#include <devpkey.h></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">void TransBuff(BYTE* buff);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">int main()</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">{</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "Hello World!\n";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> HDEVINFO hDevInfo;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> if (false) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> //全デバイス</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> hDevInfo = <span style="color: red;"><b>SetupDiGetClassDevs(</b>NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT<b>)</b></span>;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> else {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> //カメラ限定</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> hDevInfo = <span style="color: red;"><b>SetupDiGetClassDevs(</b>&GUID_DEVCLASS_CAMERA, NULL, NULL, DIGCF_PRESENT<b>)</b></span>;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> DWORD index = 0;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> SP_DEVINFO_DATA DeviceInfoData = { 0 };</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> DeviceInfoData.cbSize = sizeof(DeviceInfoData);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> BYTE Buffer[4096];</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> </span><span style="font-size: x-small;">// Get device info data</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> while (<span style="color: red;"><b>SetupDiEnumDeviceInfo(</b>hDevInfo, index, &DeviceInfoData<b>)</b></span>) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> DEVPROPTYPE PropType;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> if (true) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> <span style="color: red;"><b>SetupDiGetDeviceProperty</b>(</span></span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> hDevInfo,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &DeviceInfoData,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &DEVPKEY_Device_FriendlyName, // プリプロセッサ INITGUID が必要</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &PropType,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> Buffer,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> sizeof(Buffer),</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> NULL,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> 0);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> else {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> // DEVPKEY_Device_HardwareIds</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> <span style="color: red;"> <b>SetupDiGetDeviceProperty</b>(</span></span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> hDevInfo,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &DeviceInfoData,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &DEVPKEY_Device_HardwareIds, // プリプロセッサ INITGUID が必要</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> &PropType,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> Buffer,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> sizeof(Buffer),</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> NULL,</span></p><p class="MsoNormal" style="text-align: left;"><span style="color: red; font-size: xx-small;"> 0);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> </span><span style="font-size: x-small;"> if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_CAMERA).Data1) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "Found Cammera ";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> if (PropType == DEVPROP_TYPE_STRING || PropType ==(MAX_DEVPROP_TYPEMOD| DEVPROP_TYPE_STRING)) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> TransBuff(Buffer);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << Buffer;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "\n";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> else if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_DISPLAY).Data1) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "Found Display ";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> if (PropType == DEVPROP_TYPE_STRING || PropType == (MAX_DEVPROP_TYPEMOD | DEVPROP_TYPE_STRING)) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> TransBuff(Buffer);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << Buffer;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "\n";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> else if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_MOUSE).Data1) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "Found Mouse ";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> if (PropType == DEVPROP_TYPE_STRING || PropType == (MAX_DEVPROP_TYPEMOD | DEVPROP_TYPE_STRING)) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> TransBuff(Buffer);</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << Buffer;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> std::cout << "\n";</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> index++;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: small;"> </span><span style="font-size: xx-small;"> <b><span style="color: red;">SetupDiDestroyDeviceInfoList</span></b><span style="color: red;">(hDevInfo)</span>;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;">}</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"><br /></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">void TransBuff(BYTE* buff) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"> int ip = 0;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> int ip2 = 0;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> for (int i = 0;; i++) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> ip = i;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> ip2 = i * 2;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> buff[ip] = buff[ip2];</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> if (buff[ip2] == 0x00) {</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> break;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> }</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;"> return;</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">}</span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: xx-small;">/*****************end code**********************/</span></p><p style="text-align: left;">◎実行結果</p><p style="text-align: left;"> <span style="font-size: x-small;"> </span><span style="font-size: x-small;"><span> </span>〇カメラのデバイス情報 </span></p><p style="text-align: left;"></p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-nLmkCkfWcko/YWjnKjqsD1I/AAAAAAAABis/39bxXijJLNAqNu2HTgDO3FhV7PGYpJWpgCLcBGAsYHQ/s518/Cam1.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="518" data-original-width="465" height="320" src="https://1.bp.blogspot.com/-nLmkCkfWcko/YWjnKjqsD1I/AAAAAAAABis/39bxXijJLNAqNu2HTgDO3FhV7PGYpJWpgCLcBGAsYHQ/s320/Cam1.png" width="287" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ノートPC内臓カメラ</td></tr></tbody></table><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-gbvDLBliDK4/YWjnKgOdjlI/AAAAAAAABio/YifHHCSgeS4n7Gk93aUkDubOgw_2oFFtQCLcBGAsYHQ/s518/Cam2.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="518" data-original-width="465" height="320" src="https://1.bp.blogspot.com/-gbvDLBliDK4/YWjnKgOdjlI/AAAAAAAABio/YifHHCSgeS4n7Gk93aUkDubOgw_2oFFtQCLcBGAsYHQ/s320/Cam2.png" width="287" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">USBカメラ</td></tr></tbody></table><p></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><span> </span><span> 〇テストプログラム実行結果</span><br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-uZ5R9rexpw0/YWjnLptT8wI/AAAAAAAABi0/6paM7Y4Wna8PnW-_iWOC2gkSOuVB9JURgCLcBGAsYHQ/s979/ProgOutput2.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="512" data-original-width="979" height="334" src="https://1.bp.blogspot.com/-uZ5R9rexpw0/YWjnLptT8wI/AAAAAAAABi0/6paM7Y4Wna8PnW-_iWOC2gkSOuVB9JURgCLcBGAsYHQ/w640-h334/ProgOutput2.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">デバイス名表示</td></tr></tbody></table><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-Qgh1IMnSar0/YWjnKzst6AI/AAAAAAAABiw/HC5ivEqTnJgav5FKzhE8TifKVvfGY9jVgCLcBGAsYHQ/s979/ProgOutput.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="512" data-original-width="979" height="334" src="https://1.bp.blogspot.com/-Qgh1IMnSar0/YWjnKzst6AI/AAAAAAAABiw/HC5ivEqTnJgav5FKzhE8TifKVvfGY9jVgCLcBGAsYHQ/w640-h334/ProgOutput.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">デバイスID表示</td></tr></tbody></table><br /><span style="font-size: x-small;"><br /></span><p></p><p style="text-align: left;"><span style="font-size: x-small;"><br /></span></p><p style="text-align: left;"><span style="font-size: x-small;"><br /></span></p><p style="text-align: left;"><span style="font-size: x-small;"><br /></span></p><p style="text-align: left;"><br /></p><p class="MsoNoSpacing"><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="text-align: left;"><span style="font-size: x-small;"><br /></span></p><div><br /></div><p></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><br /><p></p>white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-81238054546918580082021-10-01T13:43:00.001+09:002021-10-09T09:33:55.454+09:00Yolo(darknet)画像検出をUSBカメラに特化したプログラムに改造darknet本体プログラムは、画像(物体)検出、機械学習、、多機能な巨大プログラムで プログラムソースは難解そのものです。(私にとっては)
そこで、USBカメラによる画像入力/画像検出のみに機能を限定したプログラムに改造することで、このプログラムの部分的な解析を行いました。<div> <table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-2iV05FEmjRk/YVZuzPzykKI/AAAAAAAABhY/GyKtN7o1hqcGnc2YKwybwEg3awkO_ph1gCLcBGAsYHQ/s680/darknet_UsbCam.png" style="clear: left; display: block; margin-bottom: 1em; margin-left: auto; margin-right: auto; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="680" data-original-width="450" height="320" src="https://1.bp.blogspot.com/-2iV05FEmjRk/YVZuzPzykKI/AAAAAAAABhY/GyKtN7o1hqcGnc2YKwybwEg3awkO_ph1gCLcBGAsYHQ/s320/darknet_UsbCam.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">USBカメラでTV画面を撮影</td></tr></tbody></table><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-QmOkwkfL5cc/YVZu14m3KfI/AAAAAAAABhc/AotF78LsSu4kpzRKbj6v-J_vcR8HjXiEQCLcBGAsYHQ/s1380/darknet_UsbCam2.png" style="clear: left; display: block; margin-left: auto; margin-right: auto; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="960" data-original-width="1380" src="https://1.bp.blogspot.com/-QmOkwkfL5cc/YVZu14m3KfI/AAAAAAAABhc/AotF78LsSu4kpzRKbj6v-J_vcR8HjXiEQCLcBGAsYHQ/s320/darknet_UsbCam2.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">取込み画像から物体検出</td></tr></tbody></table><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>1.プログラムの改造</div><div> 1)VisualStudio darknetソリューションのdarknetプロジェクトでの作業</div><div> ・OpenCvのクラス、関数を直接 使用する</div><div>メインのプログラムソース darknet.c のファイル名を AiDetect_Main.cpp (適宜)に変更 <strike>(darknet.hもdarknet.hppに変更 各ソースのヘッダー指定(#include)も変更)</strike></div><div><br /></div><div><span> </span><span> </span><span> ・動画の画像検出を 画像(静止画)の画像検出のループ処理 に置き換える。</span></div><div> 関数 test_detector() [detector.c] の内容を AiDetect_Main.cpp に展開</div><div><br /></div><div>プログラムソース AiDetect_Main.cpp</div><div>************************************************</div><div><div><span style="font-size: x-small;">#include <iostream></span></div><div><span style="font-size: x-small;">#include <time.h></span></div><div><span style="font-size: xx-small;">#include <stdlib.h></span></div><div><span style="font-size: xx-small;">#include <stdio.h></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;">#include <opencv2/opencv.hpp></span></div><div><span style="font-size: xx-small;">#include <opencv2/core/types.hpp></span></div><div><span style="font-size: xx-small;">#include <opencv2/videoio/videoio.hpp></span></div><div><span style="font-size: xx-small;">#include <opencv2/imgcodecs/imgcodecs.hpp></span></div><div><span style="font-size: xx-small;">#include <opencv2/highgui.hpp></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: x-small;">#include "darknet.h"</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;">#include "list.h"</span></div><div><span style="font-size: xx-small;">#include "parser.h"</span></div><div><span style="font-size: xx-small;">#include "option_list.h"</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;">#define CAM_FRAME_WIDTH 1920</span></div><div><span style="font-size: xx-small;">#define CAM_FRAME_HEIGHT 1080</span></div><div><span style="font-size: x-small;"><br /></span></div><div><span style="font-size: x-small;">cv::VideoCapture* cap = NULL;</span></div><div><span style="font-size: x-small;">image mat_to_image(cv::Mat mat);</span></div><div><span style="font-size: x-small;">int main(int argc, char **argv)</span></div><div><span style="font-size: xx-small;">{</span></div><div><span style="font-size: xx-small;">#ifdef _DEBUG</span></div><div><span style="font-size: xx-small;"> printf(" _DEBUG is used \n");</span></div><div><span style="font-size: xx-small;">#endif</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;">#ifdef DEBUG</span></div><div><span style="font-size: xx-small;"> printf(" DEBUG=1 \n");</span></div><div><span style="font-size: xx-small;">#endif</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><span style="white-space: pre;"> </span>int i;</span></div><div><span style="font-size: xx-small;"><span style="white-space: pre;"> </span>for (i = 0; i < argc; ++i) {</span></div><div><span style="font-size: xx-small;"><span style="white-space: pre;"> </span>if (!argv[i]) continue;</span></div><div><span style="font-size: xx-small;"><span style="white-space: pre;"> </span>strip_args(argv[i]);</span></div><div><span style="font-size: xx-small;"><span style="white-space: pre;"> </span>}</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if(argc < 2){</span></div><div><span style="font-size: xx-small;"> fprintf(stderr, "usage: %s <function>\n", argv[0]);</span></div><div><span style="font-size: xx-small;"> return 0;</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> gpu_index = find_int_arg(argc, argv, "-i", 0);</span></div><div><span style="font-size: xx-small;"> if(find_arg(argc, argv, "-nogpu")) {</span></div><div><span style="font-size: xx-small;"> gpu_index = -1;</span></div><div><span style="font-size: xx-small;"> printf("\n Currently Darknet doesn't support -nogpu flag. If you want to use CPU - please compile Darknet with GPU=0 in the Makefile, or compile darknet_no_gpu.sln on Windows.\n");</span></div><div><span style="font-size: xx-small;"> exit(-1);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> if (gpu_index >= 0) {</span></div><div><span style="font-size: xx-small;"> cuda_set_device(gpu_index);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> show_cuda_cudnn_info();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> show_opencv_info();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int letter_box = 0;</span></div><div><span style="font-size: xx-small;"> float thresh =0.25; // 0.24</span></div><div><span style="font-size: xx-small;"> float hier_thresh = 0.5;</span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"> int* gpus = 0;</span></div><div><span style="font-size: xx-small;"> int gpu = 0;</span></div><div><span style="font-size: xx-small;"> int ngpus = 0;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> gpu = gpu_index;</span></div><div><span style="font-size: xx-small;"> gpus = &gpu;</span></div><div><span style="font-size: xx-small;"> ngpus = 1;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> char* datacfg = "cfg/coco.data";</span></div><div><span style="font-size: xx-small;"> char* cfg = "cfg/yolov3.cfg";</span></div><div><span style="font-size: xx-small;"> char* weights = "yolov3.weights";</span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"> char* filename = 0;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> list* options = read_data_cfg(datacfg);</span></div><div><span style="font-size: xx-small;"> char* name_list = option_find_str(options, "names", "data/names.list");</span></div><div><span style="font-size: xx-small;"> int names_size = 0;</span></div><div><span style="font-size: xx-small;"> char** names = get_labels_custom(name_list, &names_size); //get_labels(name_list);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> image** alphabet = load_alphabet();</span></div><div><span style="font-size: xx-small;"> network net = parse_network_cfg_custom(cfg, 1, 1); // set batch=1</span></div><div><span style="font-size: xx-small;"> if (weights) {</span></div><div><span style="font-size: xx-small;"> load_weights(&net, weights);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> if (net.letter_box) letter_box = 1;</span></div><div><span style="font-size: xx-small;"> net.benchmark_layers = 0;</span></div><div><span style="font-size: xx-small;"> fuse_conv_batchnorm(net);</span></div><div><span style="font-size: xx-small;"> calculate_binary_weights(net);</span></div><div><span style="font-size: xx-small;"> if (net.layers[net.n - 1].classes != names_size) {</span></div><div><span style="font-size: xx-small;"> printf("\n Error: in the file %s number of names %d that isn't equal to classes=%d in the file %s \n",</span></div><div><span style="font-size: xx-small;"> name_list, names_size, net.layers[net.n - 1].classes, cfg);</span></div><div><span style="font-size: xx-small;"> if (net.layers[net.n - 1].classes > names_size) getchar();</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> srand(2222222);</span></div><div><span style="font-size: xx-small;"> char buff[256];</span></div><div><span style="font-size: xx-small;"> char* json_buf = NULL;</span></div><div><span style="font-size: xx-small;"> int json_image_id = 0;</span></div><div><span style="font-size: xx-small;"> FILE* json_file = NULL;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int j;</span></div><div><span style="font-size: xx-small;"> float nms = .45; // 0.4F</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int index = 1;</span></div><div><br /></div><div><span style="font-size: xx-small;"> try {</span></div><div><span style="font-size: xx-small;"> cap = new cv::VideoCapture(index);</span></div><div><span style="font-size: xx-small;"> cap->set(cv::CAP_PROP_FRAME_WIDTH, CAM_FRAME_WIDTH);</span></div><div><span style="font-size: xx-small;"> cap->set(cv::CAP_PROP_FRAME_HEIGHT, CAM_FRAME_HEIGHT);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> catch (...) {</span></div><div><span style="font-size: xx-small;"> std::cerr << " OpenCV exception: Web-camera " << index << " can't be opened! \n";</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::Mat frame;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> const std::string windowNamePrediction = "predictions";</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::namedWindow(windowNamePrediction, cv::WINDOW_GUI_NORMAL | cv::WINDOW_GUI_NORMAL);</span></div><div><span style="font-size: xx-small;"> cv::resizeWindow(windowNamePrediction, 960, 540);</span></div><div><span style="font-size: xx-small;"> cv::moveWindow(windowNamePrediction,20,20);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> while (1) {</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> //画像取得</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cap->read(frame);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> image im = mat_to_image_cv((mat_cv*)&frame);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> image sized;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> sized = resize_image(im, net.w, net.h);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> layer l = net.layers[net.n - 1];</span></div><div><span style="font-size: xx-small;"> int k;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> for (k = 0; k < net.n; ++k) {</span></div><div><span style="font-size: xx-small;"> layer lk = net.layers[k];</span></div><div><span style="font-size: xx-small;"> if (lk.type == YOLO || lk.type == GAUSSIAN_YOLO || lk.type == REGION) {</span></div><div><span style="font-size: xx-small;"> l = lk;</span></div><div><span style="font-size: xx-small;"> printf(" Detection layer: %d - type = %d \n", k, l.type);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> float* X = sized.data;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> double time = get_time_point();</span></div><div><span style="font-size: xx-small;"> // 画像認識</span></div><div><span style="font-size: xx-small;"> network_predict(net, X);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> printf("Predicted in %lf milli-seconds.\n", ((double)get_time_point() - time) / 1000);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int nboxes = 0;</span></div><div><span style="font-size: xx-small;"> detection* dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letter_box);</span></div><div><span style="font-size: xx-small;"> if (nms) {</span></div><div><span style="font-size: xx-small;"> if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets, nboxes, l.classes, nms);</span></div><div><span style="font-size: xx-small;"> else diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> //draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> //show_image(im, "predictions2");</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> //draw_detection_v3 および show_imageを以下に展開</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int ditectNo = 0;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> std::list<detection> lstDetct = std::list<detection>();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> lstDetct.clear();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> // 最も物体認識の確度が高いものを選択</span></div><div><span style="font-size: xx-small;"> // 確度が閾値未満のものを除外</span></div><div><span style="font-size: xx-small;"> for (i = 0; i < nboxes; ++i) {</span></div><div><span style="font-size: xx-small;"> int best_class = -1;</span></div><div><span style="font-size: xx-small;"> float best_class_prob = thresh;</span></div><div><span style="font-size: xx-small;"> int j;</span></div><div><span style="font-size: xx-small;"> for (j = 0; j < dets[i].classes; ++j) {</span></div><div><span style="font-size: xx-small;"> int show = strncmp(names[j], "dont_show", 9);</span></div><div><span style="font-size: xx-small;"> if (dets[i].prob[j] > best_class_prob ) {</span></div><div><span style="font-size: xx-small;"> best_class = j;</span></div><div><span style="font-size: xx-small;"> best_class_prob = dets[i].prob[j];</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if (best_class >= 0) {</span></div><div><span style="font-size: xx-small;"> dets[i].best_class_idx = best_class;</span></div><div><span style="font-size: xx-small;"> lstDetct.push_back(dets[i]);</span></div><div><span style="font-size: xx-small;"> ++ditectNo;</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> auto itrBox = lstDetct.begin();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> ///* */</span></div><div><span style="font-size: xx-small;"> for(int ib = 0 ; ib < ditectNo; ib++)</span></div><div><span style="font-size: xx-small;"> {</span></div><div><span style="font-size: xx-small;"> int idxBox = (&itrBox._Ptr->_Myval)->best_class_idx;</span></div><div><span style="font-size: xx-small;"> int clsBox = (&itrBox._Ptr->_Myval)->classes;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> // 描画 BOX</span></div><div><span style="font-size: xx-small;"> box b;</span></div><div><span style="font-size: xx-small;"> b.x = (&itrBox._Ptr->_Myval)->bbox.x;</span></div><div><span style="font-size: xx-small;"> b.y = (&itrBox._Ptr->_Myval)->bbox.y;</span></div><div><span style="font-size: xx-small;"> b.h = (&itrBox._Ptr->_Myval)->bbox.h;</span></div><div><span style="font-size: xx-small;"> b.w = (&itrBox._Ptr->_Myval)->bbox.w;</span></div><div><span style="font-size: xx-small;"> std::string strlbl = names[idxBox];</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> // 物体認識 確度</span></div><div><span style="font-size: xx-small;"> float prob = (&itrBox._Ptr->_Myval)->prob[idxBox];</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> // 描画 色 設定</span></div><div><span style="font-size: xx-small;"> int offset = idxBox * 123457 % clsBox;</span></div><div><span style="font-size: xx-small;"> float red = get_color(2, offset, clsBox);</span></div><div><span style="font-size: xx-small;"> float green = get_color(1, offset, clsBox);</span></div><div><span style="font-size: xx-small;"> float blue = get_color(0, offset, clsBox);</span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::Scalar boxColor = cv::Scalar((int)(red*255),(int)(green*255),(int)(blue*255));</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if(ib < ditectNo -1)itrBox = itrBox.operator++();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int left = (b.x - b.w / 2.) * im.w;</span></div><div><span style="font-size: xx-small;"> int right = (b.x + b.w / 2.) * im.w;</span></div><div><span style="font-size: xx-small;"> int top = (b.y - b.h / 2.) * im.h;</span></div><div><span style="font-size: xx-small;"> int bot = (b.y + b.h / 2.) * im.h;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if (left < 0) left = 0;</span></div><div><span style="font-size: xx-small;"> if (right > im.w - 1) right = im.w - 1;</span></div><div><span style="font-size: xx-small;"> if (top < 0) top = 0;</span></div><div><span style="font-size: xx-small;"> if (bot > im.h - 1) bot = im.h - 1;</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::rectangle(frame, cv::Rect(left, top, right - left, bot - top), boxColor);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::putText(frame, strlbl, cv::Point(left, top), 1, 1.5, boxColor,2);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> printf("%s left:%d right:%d top:%d bot:%d prob:%g \n",strlbl.c_str(),left,right,top,bot,prob);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> </span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cv::imshow(windowNamePrediction, frame);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> free_detections(dets, nboxes);</span></div><div><span style="font-size: xx-small;"> free_image(im);</span></div><div><span style="font-size: xx-small;"> free_image(sized);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> int key = cv::waitKey(1);</span></div><div><span style="font-size: xx-small;"> if (key == 27/*ESC*/) break;</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if (json_file) {</span></div><div><span style="font-size: xx-small;"> char* tmp = "\n]";</span></div><div><span style="font-size: xx-small;"> fwrite(tmp, sizeof(char), strlen(tmp), json_file);</span></div><div><span style="font-size: xx-small;"> fclose(json_file);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> cap->release();</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> // free memory</span></div><div><span style="font-size: xx-small;"> free_ptrs((void**)names, net.layers[net.n - 1].classes);</span></div><div><span style="font-size: xx-small;"> free_list_contents_kvp(options);</span></div><div><span style="font-size: xx-small;"> free_list(options);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> const int nsize = 8;</span></div><div><span style="font-size: xx-small;"> for (j = 0; j < nsize; ++j) {</span></div><div><span style="font-size: xx-small;"> for (i = 32; i < 127; ++i) {</span></div><div><span style="font-size: xx-small;"> free_image(alphabet[j][i]);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> free(alphabet[j]);</span></div><div><span style="font-size: xx-small;"> }</span></div><div><span style="font-size: xx-small;"> free(alphabet);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> free_network(net);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> if (gpus && ngpus > 1) free(gpus);</span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"><br /></span></div><div><span style="font-size: xx-small;"> return 0;</span></div><div><span style="font-size: xx-small;">}</span></div></div><div><br /></div><div>************************************************</div><div><div>コマンド引数 detect teset cfg/coco.data cfg/yolov3.cfg yolov3.weights</div><div>このプログラムでは detect,testは無意味</div><div><br /></div><div>cfg/yolov3.cfg yolov3.weightsはYolo4でも使えそう。</div><div>************************************************</div><div><br /></div></div><div>2.プログラムdarknetの解析</div><div><span><span> 1)画像認識(物体認識)の結果について。</span></span></div><div> 認識結果は、<span style="color: #ff00fe; font-size: small;">get_network_boxes()</span>で物体の囲むBOXと cfg/coco.data data/coco.names で指定された認識可能な種別(class)ごとの認識確度が出力される。</div><div>従って、認識確度が最も高い種別が認識された画像(物体)の種別と判定される。</div><div><br /></div><div> </div><div> </div><div><br /></div>white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-66564062628129492382021-09-26T16:46:00.002+09:002021-10-15T12:14:28.210+09:00迷いに迷って DELL G15 5511を購入(Yolo darknetで)<p> AIによる画像認識用にDELL G15を購入しました。</p><p>Windows10のセットアップからYoLo/darknetのインストール、画像認識の実行までを記します。</p><p>0.電源ON</p><p></p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-lNyq9MAQ1Ho/YVAM3vw84PI/AAAAAAAABgk/sbJSPg5A8ZIp4FmoOTKheuDwyUTLfP8oACLcBGAsYHQ/s640/DELL_KeyB.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://1.bp.blogspot.com/-lNyq9MAQ1Ho/YVAM3vw84PI/AAAAAAAABgk/sbJSPg5A8ZIp4FmoOTKheuDwyUTLfP8oACLcBGAsYHQ/s320/DELL_KeyB.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">DELL G15キーボード</td></tr></tbody></table> ・一瞬 「電源スイッチが 無い!」 と 思いきや、 キーボードの右奥端のキーに電源マーク 、1度そのキーを押してみる。 起動せず、 もう1度押してみる まだ起動せず。 しばらく置いて 数度 押す。するとようやく 画面に<span lang="EN-US">DELL</span>のマークの表示。 ようやくセットアップ開始。<div><br /></div><div>==> ノートPCを開くことがSW ON せっかちに電源キーを押したため 電源ON/OFF が意図せずに繰り返しため電源ONにてこずったようです。<p><br /></p><p>1.Window10のセットアップ</p><p> ・ローカルアカウントでセットアップできない! 昨年末 職場で<span lang="EN-US">LENOVO</span>の3台の<span lang="EN-US">PC</span>をローカルアカウントでセットアップしたのですが、今それが出来ない。一旦マイクロソフトアカウントでセットアップしてからローカルアカウントを作成。 最近の<span lang="EN-US">Windows10</span>のアップデートでそうなったのか? <span lang="EN-US">DELL</span>固有の話なのか分からない。</p><p><br /></p><p>2.YoLo/darknetのインストール</p><p><span> 1)ツールのインストール</span></p><p><span><span> </span><span> ・VisualStudio Communication 2019 の</span></span>インストール。</p><p><span> </span><span> ・CMake 3.21.2 のインストール</span><br /></p><p><span><span> </span><span> </span><span> VisualStudioのソリューション/プロジェクトの生成を行います。</span><br /></span></p><p><span><span><span> </span><span> </span><span> (数多くのパス設定、プリプロセッサ、etc.を行ってくれます。)</span><br /></span></span></p><p><span><span><span><span> </span><span> ・Nvidia CUDA11.4.2ToolKit及びCUDNN</span><br /></span></span></span></p><p><span><span><span><span> ToolKitのインストール後 CUDNNのダウンロードファイル(cudnn-11.4-windows-x64**.zip)を解凍しbin等のフォルダをCUDA ToolKitのフォルダと統合する。</span></span></span></span></p><p><span><span><span><span> 2)OpenCVのインストール</span></span></span></span></p><p><span><span><span><span> これが一番面倒 </span></span></span></span></p><p><span><span><span><span><span> </span><span> ・</span>OpenCVをダウロード後 opencv-4.5.3-vc14-vc15.exe を実行(解凍) <span> </span><span> </span><span> </span><span> </span></span></span></span></span>・CMakeで CUDAを組み込むためのオプションを設定し、Generateを行う。</p><p><span> </span><span> ・CMakeで生成された</span>OpenCVのプロジェクトのビルドを行う。</p><p><span> 3darknetのインストール</span><br /></p><p><span> ・GitHubからdarknet<span> をダウンロードする。取得したdarknet-master.zipを解凍する。</span></span></p><p><span><span><span> </span><span> ・CMakeでOpenCVを組み込むためのオプションを設定しGenerateを行う。</span><br /></span></span></p><p><span><span><span><span> </span><span> ・CMakeで生成されたdarknetのプロジェクトビルドを行う。</span><br /></span></span></span></p><p><span><span><span><span>3.</span></span></span></span>YoLo/darknetの実行</p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ZVz3cJDFJEg/YVAdNnDYOMI/AAAAAAAABgs/Nyns-V5GWwA0E-9P3lh6iyi3pRyfEHoHgCLcBGAsYHQ/s2048/KIMG0052%2B%25281%2529.JPG" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1152" data-original-width="2048" height="180" src="https://1.bp.blogspot.com/-ZVz3cJDFJEg/YVAdNnDYOMI/AAAAAAAABgs/Nyns-V5GWwA0E-9P3lh6iyi3pRyfEHoHgCLcBGAsYHQ/s320/KIMG0052%2B%25281%2529.JPG" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">darknetをDynabook及びDell G15で稼働</td></tr></tbody></table>・次のコマンドラインで実行<div>darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights data/Car.mp4</div><div><br /></div><div> Car.mp4はフリー動画をダウンロード</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><span> </span><span> </span>・実行結果</div><br /><div class="separator" style="clear: both; text-align: left;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='332' height='275' src='https://www.blogger.com/video.g?token=AD6v5dzYldmZDxYy5XZPweFDebrnbS4hAvYRedlj4y27dPFSOfbU87HpSsmhWvjm3fssiK_X2inrD5JBRQpneJRiCw' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><div class="separator" style="clear: both; text-align: left;"><span> </span><span> GPU非搭載のDynabookに比べ G15は 画像認識において70~80倍のパフォーマンスを示しました。</span><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Dynabook AVG_FPS は 0.4fps</div><div class="separator" style="clear: both;">DELL G15 AGV_FPS は 31.6fps</div><div class="separator" style="clear: both;"><br /></div></div><div class="separator" style="clear: both; text-align: left;"><span>(上の動画のAVG_FPSは OBS Studio を動画作成に使用したため3割程度低めの値を表示しています。)</span></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><span><br /></span></div><div class="separator" style="clear: both; text-align: left;"><br /></div><br /></div>white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-88388065239581442572021-07-04T11:55:00.008+09:002021-09-26T16:54:14.476+09:00妄想鉄道の夜 第1夜 Nゲージ+Arduino<h1 style="text-align: left;"> Arduino(ATMEGA328P)をNゲージに載せてみました。</h1><div><br /></div><div> 電子工作を始めたころから、鉄道模型にマイコン制御を組み込みたいと思っていました。</div><div>とりあえず、20年前に購入したNゲージを引っ張り出してSLの走行をためしました。</div><div> 最初、レールからの給電がうまくいかず。レールみがきから始めました。</div><div><br /></div><div>それから3か月ようやくマイコン搭載の車両の走行が実現出来ました。</div><div> </div><p style="text-align: left;"> 概要</p><p style="text-align: left;"> Nゲージ車両にはマイコンATMEGA328Pを搭載、コントローラからIRによる指令を受信し、モータードライバを介して、モータを制御し、前進、停止、後退、速度調整を行います。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-9lyjpyljxGE/YOEAAFmvcqI/AAAAAAAABdQ/C4SPZMtwr34mvviMseenNd8VFUcPPev3wCLcBGAsYHQ/s1082/Cm7M2_03.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="641" data-original-width="1082" height="381" src="https://1.bp.blogspot.com/-9lyjpyljxGE/YOEAAFmvcqI/AAAAAAAABdQ/C4SPZMtwr34mvviMseenNd8VFUcPPev3wCLcBGAsYHQ/w640-h381/Cm7M2_03.png" width="640" /></a></div><br /><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">車両搭載/コントローラ マイコンの選定</h2><div> 搭載マイコンは Texas InstrumentsのMSP430、Microchip Technology ATMEGA 考えています。 搭載スペースでは MSP430 開発の手軽さでは ATMEGA。とりあえず ATMEAG328Pを選択しました。</div><div><br /></div><div> コントローラ用のマイコンも開発の手軽さでArduino Nanoを選択。</div><div><br /></div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-3hm27nZBHwk/YOEXmz-AbPI/AAAAAAAABdo/eL-XrAf5MRY_L7ScC4HE_fpGoEEnEp3NwCLcBGAsYHQ/s1503/Cm7M2_06.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="386" data-original-width="1503" src="https://1.bp.blogspot.com/-3hm27nZBHwk/YOEXmz-AbPI/AAAAAAAABdo/eL-XrAf5MRY_L7ScC4HE_fpGoEEnEp3NwCLcBGAsYHQ/s320/Cm7M2_06.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Nゲージ車両</td></tr></tbody></table><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-UFatkeq5xzE/YOqWJCMkycI/AAAAAAAABeg/YNMJ2a3ydPMTzqKlcTg2qzLK_iR2fdDIQCLcBGAsYHQ/s703/Cm7M2_09.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="703" src="https://1.bp.blogspot.com/-UFatkeq5xzE/YOqWJCMkycI/AAAAAAAABeg/YNMJ2a3ydPMTzqKlcTg2qzLK_iR2fdDIQCLcBGAsYHQ/s320/Cm7M2_09.png" width="320" /></a></div><br /><div>※モータドライバ、ATMEAG328P、2200uFコンデンサーの配置がポイント、配置を間違えると、発車、停止、前進後進切替え時にマイコンが暴走、制御不能に、</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-5zTeQdIv2W8/YOEYEDgeIvI/AAAAAAAABdw/CuU4CvAokuoqmk2XEotqULte-g8ZTwcDQCLcBGAsYHQ/s328/TrCont1.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="247" data-original-width="328" src="https://1.bp.blogspot.com/-5zTeQdIv2W8/YOEYEDgeIvI/AAAAAAAABdw/CuU4CvAokuoqmk2XEotqULte-g8ZTwcDQCLcBGAsYHQ/s320/TrCont1.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Nゲージコントローラ</td></tr></tbody></table><div><br /></div><div> ※意外と、電動ポイントの駆動に電流が必要なことが判明、1000uF~4700uFのコンデンサに電荷をため込み、一気に放電させることでなんとか 電動ポイントの駆動に成功。</div><div> 極性(+/―)の反転用にモータドライバを使用。</div><div> (コンデンサー/モータードライバ間に抵抗を配置して、過電流の防止を試みたが失敗、いろいろやって 2200uF のコンデンサを採用しました。)</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-om2gsRhMqeo/YOqX_9ZyPHI/AAAAAAAABeo/t0mFZbOIKGcKKIoLkYRjihBbhoJTN1KLgCLcBGAsYHQ/s928/Cm7M2_10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="644" data-original-width="928" src="https://1.bp.blogspot.com/-om2gsRhMqeo/YOqX_9ZyPHI/AAAAAAAABeo/t0mFZbOIKGcKKIoLkYRjihBbhoJTN1KLgCLcBGAsYHQ/s320/Cm7M2_10.png" width="320" /></a></div><br /><div><br /></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><h2 style="text-align: left;">マイコンのプログラミング 開発環境</h2><div> 開発環境はArduinoIDEを使用します。</div><br /><div><a href="https://1.bp.blogspot.com/-uW2fUPZ9mSQ/YOEMhsY4WyI/AAAAAAAABdY/EStSNipvHVw-MCA8gRd0bbEVsM5v6bDRACLcBGAsYHQ/s627/Cm7M2_04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="486" data-original-width="627" src="https://1.bp.blogspot.com/-uW2fUPZ9mSQ/YOEMhsY4WyI/AAAAAAAABdY/EStSNipvHVw-MCA8gRd0bbEVsM5v6bDRACLcBGAsYHQ/s320/Cm7M2_04.png" width="320" /></a><a href="https://1.bp.blogspot.com/-uW2fUPZ9mSQ/YOEMhsY4WyI/AAAAAAAABdY/EStSNipvHVw-MCA8gRd0bbEVsM5v6bDRACLcBGAsYHQ/s627/Cm7M2_04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://1.bp.blogspot.com/-uW2fUPZ9mSQ/YOEMhsY4WyI/AAAAAAAABdY/EStSNipvHVw-MCA8gRd0bbEVsM5v6bDRACLcBGAsYHQ/s627/Cm7M2_04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://1.bp.blogspot.com/-uW2fUPZ9mSQ/YOEMhsY4WyI/AAAAAAAABdY/EStSNipvHVw-MCA8gRd0bbEVsM5v6bDRACLcBGAsYHQ/s627/Cm7M2_04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a>Arduino IDE は setup()関数で初期処理、Loop()関数で処理の本体を C言語で記述します。</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>ボードマネージャで 車両搭載マイコン ATMEAG328Pの場合Arduino Unoを選択、コントローラ用のマイコンの場合 Arduino Nano を選択して プログラミングを行います。 </div><div><a href="https://1.bp.blogspot.com/-eVS8FW-km-U/YOEOvhage9I/AAAAAAAABdg/q3s5AcCqqFk9vgyTVILxKdQep1Zx7Z89QCLcBGAsYHQ/s1053/Cm7M2_05.png" style="clear: left; display: inline; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="475" data-original-width="1053" height="180" src="https://1.bp.blogspot.com/-eVS8FW-km-U/YOEOvhage9I/AAAAAAAABdg/q3s5AcCqqFk9vgyTVILxKdQep1Zx7Z89QCLcBGAsYHQ/w400-h180/Cm7M2_05.png" width="400" /></a>(ターゲット毎に切替えるのは結構面倒)</div><div><br /></div><h2 style="text-align: left;">ATMEAG328Pのプログラミングについて</h2><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Q00WeV5xylI/YOqS2uOq1UI/AAAAAAAABeI/-khMkhTJj6Q6ycFo_-s2inMO4MkGmxcWACLcBGAsYHQ/s475/UnoR3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="392" data-original-width="475" src="https://1.bp.blogspot.com/-Q00WeV5xylI/YOqS2uOq1UI/AAAAAAAABeI/-khMkhTJj6Q6ycFo_-s2inMO4MkGmxcWACLcBGAsYHQ/s320/UnoR3.png" width="320" /></a></div><br /><div><br /></div><div>ATMEAG328Pのプログラミングは、Aruduino UNO R3 自体に 取り外し可能な ATMEAG328P が搭載されているので Arduino Unoとしてプログラミングして、プログラムの書き込み後、UNOから取り外し、Nゲージ車両に搭載します。</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-br15khQbJVk/YOqU_mw4Q7I/AAAAAAAABeY/_prKAwQUH9k2CAktkK4A1Vfik0Hr6xBtgCLcBGAsYHQ/s736/Cm7M2_08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="550" data-original-width="736" src="https://1.bp.blogspot.com/-br15khQbJVk/YOqU_mw4Q7I/AAAAAAAABeY/_prKAwQUH9k2CAktkK4A1Vfik0Hr6xBtgCLcBGAsYHQ/s320/Cm7M2_08.png" width="320" /></a></div><br /><div><br /></div><div> </div><div>※ Arduino IDEでのプログラミングで ピン「D9」 を使った場合 ATMEAG328Pでは PB1 15ピンを使うことになる。</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><br /><div><h2>マイコンのプログラミング 実装</h2></div><div> 今回のプログラミングの中心は 赤外線通信です。参考のプログラムコードはArduino IDEのスケッチ例から取得しました。</div><div><br /></div><div> IR通信 送信側(Nゲージコントローラ側)</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-6_9EbA-badM/YOEdhs3xOAI/AAAAAAAABeA/uG_-LZxTjK4C4AjMm9qrZe9jRzem5uhUgCLcBGAsYHQ/s849/Cm7M2_07.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="849" data-original-width="634" height="400" src="https://1.bp.blogspot.com/-6_9EbA-badM/YOEdhs3xOAI/AAAAAAAABeA/uG_-LZxTjK4C4AjMm9qrZe9jRzem5uhUgCLcBGAsYHQ/w299-h400/Cm7M2_07.png" width="299" /></a></div><br /><div><br /></div><div>Nゲージコントローラ側のプログラミングはスケッチ例/IRemote/IRsendRawDemoを参考にしました。</div><div><br /></div><div>(※IrSender.sendRaw_P()を使用)</div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"> IR通信 受信側(Nゲージ車両側)</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">【きむ茶工房ガレージハウス】 ◆ 赤外線リモコンを送信器にして何か動かす記事さんのコードを拝借</div><div class="separator" style="clear: both; text-align: left;"> 赤外線リモコン受信モジュールの信号の Hi/Low の 間隔を測り 受信データをビットパターンで取得する。</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><iframe allowfullscreen="" class="BLOG_video_class" height="357" src="https://www.youtube.com/embed/uaZ_0YPHWN0" width="466" youtube-src-id="uaZ_0YPHWN0"></iframe></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div></div><br /><p style="text-align: left;"><br /></p><div class="separator" dir="rtl" style="clear: both; text-align: center;"><br /></div><br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-60278443894467850922019-11-01T12:59:00.001+09:002019-11-01T12:59:17.195+09:00LED8x8x8 デモ展示<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-dazGVFghg7Q/XbupVUhvdyI/AAAAAAAABXM/trhc901r-Iw4UZD9rhhLmS8WZVJPYa24ACLcBGAsYHQ/s1600/8x8lesd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="780" height="234" src="https://1.bp.blogspot.com/-dazGVFghg7Q/XbupVUhvdyI/AAAAAAAABXM/trhc901r-Iw4UZD9rhhLmS8WZVJPYa24ACLcBGAsYHQ/s320/8x8lesd.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
1. 500個のLED<br />
<div>
今年の4月大阪 日本橋の電子パーツ屋のレジ横に、LEDキューブ(5✖5✖5)の展示が目につきました。ロジックIC等の会計をしている間、青く光る125個のLEDが綺麗に点滅しているのに目を奪われました。過去にCEATEC等の電子デバイスの展示会等で何回も目にしていたとは思うのですが、その時はあまり興味がわきませんでした。なぜかレジ横のLEDキューブが目に付いたのでした。会計を済ませ、店を出る間際、特売ワゴンの中に500個千円の赤LEDを発見、咄嗟にLED8X8X8が作れるかもと思い、それを手にとりレジに逆戻り。</div>
<div>
<br /></div>
<div>
2. 256個のロジックICの妄想<br />
帰りの電車の中、さてLEDキューブどうやって組み上げるかいろいろ考え、、ほぼ妄想レベル。。。 マイコンとのインターフェイスは XYZの3次元指定とし、8ピン×3 + GND で 25ピン。 LEDのON/OFFはANDのロジックICを2段で、、、と思いつきのままあれやこれやと考え、最終的には、ロジックIC幾つ使うのか、ANDのロジックICは4回路入りなので256個必要になると思い至り、こりゃ無理、絶対無理。帰宅早々 500個のLEDは、ストックBOXに。</div>
<div>
<br />
3.トラ技5月号 PSoc付録基板 その2<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-0S1Fo7yb8D8/XbucDJHPyaI/AAAAAAAABWs/CdzVHRWH2_gUV9Lb8OqvAbUWS_hf2ckYACLcBGAsYHQ/s1600/LED8X8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="687" data-original-width="683" height="320" src="https://1.bp.blogspot.com/-0S1Fo7yb8D8/XbucDJHPyaI/AAAAAAAABWs/CdzVHRWH2_gUV9Lb8OqvAbUWS_hf2ckYACLcBGAsYHQ/s320/LED8X8.png" width="318" /></a></div>
</div>
<div>
74HC595によるシリアル/パラレルの信号変換の検証に、お題は8✖8のLEDの表示をマイコンの4ピン(SI✖2、RCK、SCK)で実現させること。マイコンは、直近で扱っていたトラ技のPSoc基板を使い。LED8x8は自作(市販で300円程度で買えるのですが、あいにく手元に無かったので)<br />
まず表示を 行(ROW)/列(COL) 指定で1つのLEDを点灯、これを64回繰り返して1面の表示を考えたが、輝度は1/64で暗く、かなりちらつくと予想されるのでNG、次に列(COL)ごとに8つのLEDを点灯、8列分繰り返しての表示を行うことにしました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-UD4fhKstbEo/XbunDSh5n1I/AAAAAAAABW4/TQARWWYWZiUxT2Oa9VqZVfSYiGCt-2LVwCLcBGAsYHQ/s1600/8x8DataPtn.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="451" data-original-width="727" height="198" src="https://1.bp.blogspot.com/-UD4fhKstbEo/XbunDSh5n1I/AAAAAAAABW4/TQARWWYWZiUxT2Oa9VqZVfSYiGCt-2LVwCLcBGAsYHQ/s320/8x8DataPtn.png" width="320" /></a></div>
PSocで1列毎の表示データ(8ビット)を1面分8列、これを8面分持たせ8X8の8コマの動画の表示を行いました。<br />
<br />
<br />
<br />
<br />
<br />
<br />
4.LED8x8x8<br />
さて、LED8x8の表示を実現すると、このLED8x8を8枚重ねれば、諦めていたLEDキューブ(8x8x8)ができると思い。ストックBOXから、半年ぶりに500個のLEDを取り出し、(不足分12は別の赤LED)8枚のLED8x8をはんだ付けで作成これを積み重ねてLEDキューブらしきものが出来上がりました。<br />
原理は、LED8x8の アノード(+)側 8ビットを64ビットにし LED64✖8 マイコン側のプログラムを 8ビットデータを64ビットに拡張しただけ、原理的には LED8x8とほぼ同じ思考で組み上げました。<br />
ただ、512個のLED、9個の74HC595、2個の74HC126(カソード側(-)反転用)<br />
と配線のはんだ付けが大変でした。<iframe allowfullscreen="" frameborder="0" height="344" src="https://www.youtube.com/embed/PcfgCulN8Fw" width="459"></iframe></div>
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-36426906920102486732019-06-14T17:02:00.000+09:002019-06-14T17:02:15.347+09:00トラ技PSoc基板をためしました。トランジスタ技術5月号付録のPSoc基板を入手、この2か月あれやこれやといじっています。今回74HC595によるシリアル/パラレル変換をテストしました。<br />
<br />
1.LCDディスプレイ表示<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-rk9ODljN9pg/XP8hSSxQoSI/AAAAAAAABT8/PUPOFBzpRMcXDWaB2PxOdxhGynnO8fObQCLcBGAs/s1600/Toragi00.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="603" data-original-width="799" height="241" src="https://1.bp.blogspot.com/-rk9ODljN9pg/XP8hSSxQoSI/AAAAAAAABT8/PUPOFBzpRMcXDWaB2PxOdxhGynnO8fObQCLcBGAs/s320/Toragi00.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: start;">キャラクタLCDディスプレイ(SC1602)表示</span></td></tr>
</tbody></table>
<br />
キャラクタLCDディスプレイの表示にはPSoc Creatorで提供されるサンプルコードを利用します。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-kVju9M89ypU/XP8jRyT8BuI/AAAAAAAABUI/QCF9h9U7yng6k7tjdJ4mZte0UJAdRLRNgCLcBGAs/s1600/Toragi04.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="467" data-original-width="624" height="239" src="https://1.bp.blogspot.com/-kVju9M89ypU/XP8jRyT8BuI/AAAAAAAABUI/QCF9h9U7yng6k7tjdJ4mZte0UJAdRLRNgCLcBGAs/s320/Toragi04.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">サンプルコード選択</td></tr>
</tbody></table>
<br />
〇プロジェクト新規作成<br />
・プロジェクトテンプレート選択で「Code example」を選択。<br />
<br />
・サンプルコード(code example)選択で「Char_LCD_Horizontal_Bar_Graph」を選択。<br />
<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-bgTcCHmP4ko/XQL4L9uA16I/AAAAAAAABUc/Kt79EmnFL30G0w-entZgf7mKBvccCcrrgCLcBGAs/s1600/Toragi05.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="486" data-original-width="934" height="166" src="https://1.bp.blogspot.com/-bgTcCHmP4ko/XQL4L9uA16I/AAAAAAAABUc/Kt79EmnFL30G0w-entZgf7mKBvccCcrrgCLcBGAs/s320/Toragi05.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bootladableコンポーネント追加</td></tr>
</tbody></table>
<br />
・Bootladableコンポーネントを追加(トラ技 Lチカプロジェクト(LEDBLINK) 参考)<br />
<br />
<br />
<br />
<br />
<br />
〇このサンプルプロジェクトをビルド後PSoc基板に書き込む。<br />
※書き込み後 サンプルプログラムが動き出す。<br />
〇このプロジェクトのデモ表示部を削除して、LDC表示のみを残しベースプロジェクトとします。<br />
<br />
2.GPIO割り込みの実装<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-VzzDRMrhyFw/XQMJJcUm28I/AAAAAAAABVA/uBthiWlu4gga_EW63vfo5f4sg8PVdPcRACLcBGAs/s1600/Toragi06.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="426" data-original-width="990" height="137" src="https://1.bp.blogspot.com/-VzzDRMrhyFw/XQMJJcUm28I/AAAAAAAABVA/uBthiWlu4gga_EW63vfo5f4sg8PVdPcRACLcBGAs/s320/Toragi06.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">操作SW用 Digital Input Pin コンポーネント追加</td></tr>
</tbody></table>
テスト基板の3つの操作スイッチの割り込みを実装します。<br />
〇Digital Input Pinコンポーネントの追加<br />
・Number Of Pinsを3に<br />
・Interruptの設定<br />
<br />
<br />
<br />
〇main.cの編集<br />
・CY_ISR_PROTOマクロを使用してGPIO割り込み関数を宣言<br />
CY_ISR_PROTO(GPIO_ISR);<br />
・CY_ISRマクロを使用してGPIO割り込み関数を定義<br />
CY_ISR(GPIO_ISR)<br />
{<br />
uint8 InterruptState = SW_ClearInterrupt();<span style="white-space: pre;"> </span><br />
・・・・・・・・<br />
※InterruptStateにPinのIDが格納<br />
・main()に初期処理を追加<br />
isr_1_StartEx(GPIO_ISR); ・・・・GPIO割り込み関数を登録<br />
CyGlobalIntEnable; ・・・・・割り込みを許可<br />
<br />
3.74HC595のテスト<br />
今回は、74HC595(シリアル/パラレル変換)のテストを行った。<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-eJVAlfhfuVU/XQNFjuH3eUI/AAAAAAAABVM/BJcaDSL4OqMdXEFSWXVKvTjVvTp1jfbCQCLcBGAs/s1600/Toragi02.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="585" data-original-width="527" height="320" src="https://1.bp.blogspot.com/-eJVAlfhfuVU/XQNFjuH3eUI/AAAAAAAABVM/BJcaDSL4OqMdXEFSWXVKvTjVvTp1jfbCQCLcBGAs/s320/Toragi02.png" width="288" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">74HC595テスト構成</td></tr>
</tbody></table>
<br />
<br />
・操作スイッチSW1~3でLEDの点灯パターンを切り替え。<br />
・PSoc4100S ==> 74HC595 はシリアル。<br />
・74HC126は今回のテストでは不要<br />
(ほぼ無意味)<br />
・PSoc4100S<==>LCDキャラクタLCDディスプレイの接続はP0をP2に変更<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-EoJap7_HOK0/XQNFwKCA9PI/AAAAAAAABVQ/lsCe1js3800s4wAskB35T3f2bZEudEtewCLcBGAs/s1600/Toragi01.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="689" data-original-width="1169" height="188" src="https://1.bp.blogspot.com/-EoJap7_HOK0/XQNFwKCA9PI/AAAAAAAABVQ/lsCe1js3800s4wAskB35T3f2bZEudEtewCLcBGAs/s320/Toragi01.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">74HC595テスト</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-gnJFufBc-8E/XQNRPX7nfwI/AAAAAAAABVg/elKoE-IVzZIiXZreYys7jdqnX9rik7sdACLcBGAs/s1600/Toragi03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="487" data-original-width="847" height="183" src="https://1.bp.blogspot.com/-gnJFufBc-8E/XQNRPX7nfwI/AAAAAAAABVg/elKoE-IVzZIiXZreYys7jdqnX9rik7sdACLcBGAs/s320/Toragi03.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
※※※※※main.c※※※※※※<br />
<br />
#include <stdlib .h=""></stdlib><br />
#include <project .h=""></project><br />
<br />
/* The LCD format in characters */<br />
#define LCD_ROWS (2u)<br />
#define LCD_COLUMNS (16u)<br />
<br />
/* The delay between displaying bar graphs */<br />
#define BARGRAPH_DELAY_MS (15u)<br />
<br />
CY_ISR_PROTO(GPIO_ISR);<br />
<br />
int iPtn = 0;<br />
<br />
void fnc_595(int ic){<br />
int i;<br />
int j;<br />
int k;<br />
k = 128;<br />
j = ic;<br />
RCK_Write(0);<br />
for(i=0;i<8 i="" p=""> if( k & j){<br />
SI_Write(1);<br />
} else {<br />
SI_Write(0);<br />
}<br />
SCK_Write(1); <br />
CyDelay(10u);<br />
SCK_Write(0);<br />
k = k >> 1;<br />
}<br />
RCK_Write(1);<br />
return;<br />
}<br />
<br />
int main()<br />
{<br />
int idat = 1;<br />
<br />
/* Start the LCD */<br />
LCD_Start();<br />
<br />
/* Show the demo start message */<br />
LCD_Position(0u, 0u);<br />
LCD_PrintString("Test 74HC595");<br />
LCD_Position(1u, 0u);<br />
LCD_PrintString("#####05######");<br />
SI_Write(0);<br />
RCK_Write(0);<br />
SCK_Write(0);<br />
CyDelay(1000u);<br />
<br />
isr_1_StartEx(GPIO_ISR);<br />
CyGlobalIntEnable;<br />
<br />
for(;;)<br />
{<br />
if(iPtn == 0){<br />
idat++;<br />
}else if(iPtn ==1){<br />
if(idat == 0) idat = 1;<br />
else idat = idat << 1;<br />
}else if(iPtn ==2){<br />
if(idat == 0) idat = 128;<br />
else idat = idat >> 1;<br />
}<br />
idat = idat & 0xFF;<br />
fnc_595(idat);<br />
CyDelay(100u);<br />
}<br />
}<br />
<br />
CY_ISR(GPIO_ISR)<br />
{<br />
uint8 InterruptState = SW_ClearInterrupt();<span style="white-space: pre;"> </span><br />
char cbuff[8];<br />
<br />
itoa(InterruptState,cbuff,10);<br />
<br />
LCD_Position(1u, 0u);<br />
<br />
if (InterruptState == 1){<br />
LCD_PrintString("##Key1##");<br />
iPtn =0;<br />
<br />
}else if (InterruptState == 2){<br />
LCD_PrintString("##Key2##");<br />
iPtn =1;<br />
<br />
}else if (InterruptState == 4){<br />
LCD_PrintString("##Key3##"); <br />
iPtn =2;<br />
<br />
}else {<br />
LCD_PrintString("##KeyX##");<br />
}<br />
LCD_Position(1u, 9u);<br />
LCD_PrintString(cbuff);<br />
}<br />
※※※※※※※※※※※※※※※※※※<br />
<br />
GPIO割り込み時の押されたスイッチの識別は<br />
uint8 InterruptState = SW_ClearInterrupt();<span style="white-space: pre;"> </span><br />
の InterruptState に格納される値で行いました。<br />
Digital Input PinコンポーネントのSWのピンIDで<br />
SW[0]の場合 1<br />
SW[1]の場合 2<br />
SW[2]の場合 4 となるようです。<br />
<br />
<br />
<br />
<br />
<br /></8>white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-21409659965082234892018-07-06T13:11:00.004+09:002018-07-06T13:11:59.969+09:00Dynabook分解修理<w:sdt contentlocked="t" id="89512093" sdtgroup="t"><span lang="EN-US" style="font-family: "Calibri",sans-serif; font-size: 1.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: 游明朝; mso-fareast-language: JA; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin;"><w:sdtpr></w:sdtpr><w:sdt docpart="82DD7973F5604ED3A5B4F5A3069E044A" id="89512082" storeitemid="X_5F329CAD-B019-4FA6-9FEF-74898909AD20" text="t" title="投稿タイトル" xpath="/ns0:BlogPostInfo/ns0:PostTitle"></w:sdt></span>
</w:sdt><br />
<div class="Publishwithline">
<span style="font-family: 游明朝, serif;"> ◎昨年暮れ、電車の網棚から</span><span lang="EN-US">Dynabook</span><span style="font-family: 游明朝, serif;"> </span><span lang="EN-US">AZ85/UG</span><span style="font-family: 游明朝, serif;"> が落下。</span></div>
<div class="MsoNormal" style="mso-char-indent-count: 1.0; text-indent: 11.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">電車の網棚に置いたバックを下ろそうとしたところ、ちょっと何か引っかかる感覚があり、強引にバックの持ち手を引っ張ったところ、バックの勢いに、持ち手を放してしまい、バックは勢いよく床に落下、バックの</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">を確認したところ、右のヒンジの付近が大破、電源のスイッチも浮き上がり押しても無反応、ああああああああ!</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 帰宅後、「とりあえず、ハードディスクだけでも無事であってくれ!」 と思いながら、クラッシュ</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">を分解、筐体の損傷は激しいものの、マザーボードは奇跡的無事、そこで、分解途中で、電源スイッチ(内部 基板上)を押すと、いつもの通り起動、不幸中の幸い、しかし依然として、普段の使用には耐えない状態、何とかして、筐体を入手出来ないかと。。。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-9X6SrmDlgR0/Wz7rZLu004I/AAAAAAAABSw/OulVzBp-tCA_AY4evt62vuwG5AVRFKJ7QCLcBGAs/s1600/DSCN1779.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://3.bp.blogspot.com/-9X6SrmDlgR0/Wz7rZLu004I/AAAAAAAABSw/OulVzBp-tCA_AY4evt62vuwG5AVRFKJ7QCLcBGAs/s320/DSCN1779.JPG" width="320" /></a></div>
<span lang="EN-US" style="mso-no-proof: yes;"><v:shapetype coordsize="21600,21600" filled="f" id="_x0000_t75" o:preferrelative="t" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" stroked="f">
<v:stroke joinstyle="miter">
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0">
<v:f eqn="sum @0 1 0">
<v:f eqn="sum 0 0 @1">
<v:f eqn="prod @2 1 2">
<v:f eqn="prod @3 21600 pixelWidth">
<v:f eqn="prod @3 21600 pixelHeight">
<v:f eqn="sum @0 0 1">
<v:f eqn="prod @6 1 2">
<v:f eqn="prod @7 21600 pixelWidth">
<v:f eqn="sum @8 21600 0">
<v:f eqn="prod @7 21600 pixelHeight">
<v:f eqn="sum @10 21600 0">
</v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:formulas>
<v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f">
<o:lock aspectratio="t" v:ext="edit">
</o:lock></v:path></v:stroke></v:shapetype><v:shape id="図_x0020_3" o:spid="_x0000_i1028" style="height: 392.25pt; mso-wrap-style: square; visibility: visible; width: 580.5pt;" type="#_x0000_t75">
<v:imagedata o:title="" src="file:///C:/Users/YANAGI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg">
</v:imagedata></v:shape></span><span lang="EN-US"><o:p></o:p></span><br />
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ◎ヤフオク</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 筐体入手に、</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のジャンク品が無いかとヤフオクを検索、筐体だけ必要なので(メモリ、ハードディスク、</span><span lang="EN-US" style="font-family: "MS 明朝",serif; mso-bidi-font-family: "MS 明朝";">LCD</span><span style="font-family: "MS 明朝",serif; mso-bidi-font-family: "MS 明朝";">ディスプレイなどは不要) 予算<span lang="EN-US">5000</span>円前後で</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">「</span><span lang="EN-US">Dynabook AZ</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">」でジャンク品を探すのですが、</span><span lang="EN-US">AZ</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">シリーズ自体出品数が少なく、なかなか予算内で落札できず、</span><span lang="EN-US">3</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">か月経過、そんな時、秋葉原でノート</span><span lang="EN-US">PC </span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のジャンク品を漁っていた時(</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のジャンク品はほとんど1世代より古い型ばかりで)、中古ノート</span><span lang="EN-US">PC</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">売り場で、同じ筐体のものがあるのを見つける、はじめ </span><span lang="EN-US">AZ</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">シリーズの下位モデルと思いきや、「</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> </span><span lang="EN-US">T55</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">」 あれれ!</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">そこで、ヤフオクの検索条件に </span><span lang="EN-US">T</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">シリーズを追加、一気に対象が増えました、しかし依然として、落札に至らず。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 1.0; text-indent: 11.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">苦節6か月ようやく、</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> </span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ジャンク品を落札、届いた</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">を確かめると、美品、筐体損傷なし、メモリなし、ハードディスクなし、送料込みで</span><span lang="EN-US">7300</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">円、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/--Cu0B-qVDUg/Wz7rpoYxF-I/AAAAAAAABS8/pmE5QTtXhEEWNBUnQuepQOeuv14RB_c1wCLcBGAs/s1600/Db001b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="852" data-original-width="1600" height="170" src="https://3.bp.blogspot.com/--Cu0B-qVDUg/Wz7rpoYxF-I/AAAAAAAABS8/pmE5QTtXhEEWNBUnQuepQOeuv14RB_c1wCLcBGAs/s320/Db001b.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="MsoNormal">
<span lang="EN-US" style="mso-no-proof: yes;"><v:shape id="図_x0020_4" o:spid="_x0000_i1027" style="height: 306.75pt; mso-wrap-style: square; visibility: visible; width: 8in;" type="#_x0000_t75">
<v:imagedata o:title="" src="file:///C:/Users/YANAGI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg">
</v:imagedata></v:shape></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> </span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">◎</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">に</span><span lang="EN-US">AG85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">を移植</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 一抹の不安を持ちながら、移植開始、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">・両方の筐体を開く、まずマザーボードを確認、基板は同じ(乗っかっているパーツは結構異なっていました。)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">・</span><span lang="EN-US">AZ85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のメモリ、ハードディスクを外す。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">ここからは</span><span lang="EN-US">AZ85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">平行して作業を行う。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">・光学ドライブを外す。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">・マザーボードに繋がっているフラットケーブルを外す(同じフラットケーブルでもコネクタのロックが異なっているものがある、要注意)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 2.0; text-indent: 22.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">・マザーボードの</span><span lang="EN-US">CPU</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">クーラーを外す。固定のねじを外し、マザーボードを外す。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-no-proof: yes;"><v:shape id="図_x0020_2" o:spid="_x0000_i1026" style="height: 192pt; mso-wrap-style: square; visibility: visible; width: 8in;" type="#_x0000_t75">
<v:imagedata o:title="" src="file:///C:/Users/YANAGI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg">
</v:imagedata></v:shape></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ・</span><span lang="EN-US">LCD</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">ディスプレイ部を外す。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ・その他のパーツを筐体から外す。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ・取り外した</span><span lang="EN-US">AZ85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のパーツを</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の筐体に取り付ける。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ahk9SlPI3hQ/Wz7rwtqvUnI/AAAAAAAABTA/4qh0vmgxr1wp6GvaZWccYleaDUPug-xHwCLcBGAs/s1600/Db002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="535" data-original-width="1600" height="211" src="https://2.bp.blogspot.com/-ahk9SlPI3hQ/Wz7rwtqvUnI/AAAAAAAABTA/4qh0vmgxr1wp6GvaZWccYleaDUPug-xHwCLcBGAs/s640/Db002.png" width="640" /></a></div>
<br />
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">◎復活 </span><span lang="EN-US">Dynabook<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> ・</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">に電源アダプタをつなげスイッチ</span><span lang="EN-US">ON</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 無事起動(まずは念のため、最初はバッテリーパックを外した状態)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-no-proof: yes;"><v:shape id="図_x0020_5" o:spid="_x0000_i1025" style="height: 392.25pt; mso-wrap-style: square; visibility: visible; width: 477pt;" type="#_x0000_t75">
<v:imagedata o:title="" src="file:///C:/Users/YANAGI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg">
</v:imagedata></v:shape></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">◎バッテリーパックの装着</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: 1.0; text-indent: 11.0pt;">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">バッテリーパックが</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">と</span><span lang="EN-US">AZ85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">で共通かどうか不明、いろいろ調べると、ヤフーショッピング等で購入できる</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のバッテリーパックの対応機種のリストに</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の記載があるものの</span><span lang="EN-US">AZ85</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">は無い、注意書きに「型式が異なる場合、極性等が異なる場合があるので、他の型式の</span><span lang="EN-US">PC</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">への流用は行わない」との記載 覚悟を決めて、</span><span lang="EN-US">T45</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">のバッテリーパックを装着、スイッチ</span><span lang="EN-US">ON</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、バッテリーパックの異常発熱等が無いか確かめながら、復活</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の機能の確認をおこないました、最初バッテリーの状態を画面で確認すると、バッテリーが認識されていない表示、やはりだめかと思いながら十数分放置、すると充電が10%の表示、最終的に100%の充電が確認できました。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-uOZsaUgpsgw/Wz7r2SpueDI/AAAAAAAABTI/HfbPKmF-K40Dz56jLa65jlHTsDyNwzl1ACEwYBhgL/s1600/Db003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1316" data-original-width="1600" height="263" src="https://1.bp.blogspot.com/-uOZsaUgpsgw/Wz7r2SpueDI/AAAAAAAABTI/HfbPKmF-K40Dz56jLa65jlHTsDyNwzl1ACEwYBhgL/s320/Db003.png" width="320" /></a></div>
<br />
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">◎まとめ</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 今までデスクトップ</span><span lang="EN-US">PC</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、オフコン、</span><span lang="EN-US">EWS</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">等の分解修理の経験(十数年まえ)はあったのですが、初のノート</span><span lang="EN-US">PC</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の分解で当初不安で、ヤフオクであまり高額のジャンク品には手が出ませんでした。実際に</span><span lang="EN-US">Dynabook</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の分解を始めると、筐体の開きやフラットケーブルの扱いに若干手間取るものの、デスクトップ</span><span lang="EN-US">PC</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">の分解修理と大差無いことが実感されました。今思えば、ヤフオクでもう少し頑張れば、、、、</span><span lang="EN-US">6</span><span style="font-family: "游明朝",serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">か月かけての復活は少々時間を無駄にした感が否めません。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-64934072191312704242017-12-10T11:45:00.003+09:002017-12-10T11:55:53.316+09:00IOT事始め その2 前回に引き続き、Texas Instruments のマイコン RM57 Launch Padを利用してIOTの実現を試みた内容を忘備録的に述べます。<br />
前回のデモプログラムでは ただRM57が抱えている、固定のHTTPファイルを単にWebブラウザに配信するだけで物足りなさを感じていました。RM57の処理した結果をHTTPファイルに反映させる必要があると考えました。まず、デモプログラムのファイルシステム(fsdata)にある、index.htmlを書き換えることで、動的なHTTPファイルを実現出来ないかと考えました。<br />
ソースとなるHTMLファイルに書き換え領域を示すタグを仕込み、その領域をRM57で処理した結果で書き換えれば、多少の制約があるが程々のものができるのではないか、しかしデモプログラムのソースをチェックすると。fs.cにfs_read()はあるけれど、fs_write()がありません。安直にfs_read()でindex.htmlを読み込み、タグをRX57のプログラムで適当に編集した文字列で置き換え、fs_write()でこのファイルを更新してしまえば、当初のIOTの実現が達成されるのではと。。。<br />
そうなると、ファイルシステム(fsdata)を動的なものに置き換える必要があります。以前、SDカードの読み込みをRM57で試していましたが、なかなかうまくいかず挫折していましたが、今回再度挑戦、、、長期戦を決断しました。<br />
<br />
ファイルシステムをSDカードのファイルシステム FatFs に置き換えることで動的なファイルシステムを実装することにしました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-cCwocmkkk5w/WiyUJwDq6iI/AAAAAAAABRw/_gbY1nDXRnkfkt_sKqksT_Vjw3WjERCnACLcBGAs/s1600/testweb_lwip03_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1065" data-original-width="1362" height="500" src="https://1.bp.blogspot.com/-cCwocmkkk5w/WiyUJwDq6iI/AAAAAAAABRw/_gbY1nDXRnkfkt_sKqksT_Vjw3WjERCnACLcBGAs/s640/testweb_lwip03_1.png" width="640" /></a></div>
<br />
RM57は、豊富ペリフェラルを持ちSDメモリーカードに使用するSPIも単独で使用することができました。<br />
後はひたすら、httpd.cの fs_read(),fs_open()を FatFsのf_read(),f_open()に置き換えることで生じる膨大なビルドエラーに対応しました。<br />
あと、#define で LWIP_HTTPD_DYNAMIC_FILE_READ 、LWIP_HTTPD_DYNAMIC_FILE_READ を定義する必要があります。<br />
<br />
<br />
なんとか、SDカードにあるHTMLファイルが Webブラウザに表示できるようになりました。 すると今度はWebブラウザからRM57を制御したくなりました。<br />
今から十数年まえ、NetscapeのWebサーバでCGIを使っていた事を思い出すと、httpd.cのコメントにCGIの記載があることに気が付きました。<br />
<br />
今度はCGIの実装に挑戦です。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VwXePvYqaJg/Wiyh_IRAKOI/AAAAAAAABSM/YsdcLNtShKcXdrE_z2mx5FG_FUpTA0p-ACLcBGAs/s1600/testweb_lwip03_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1011" src="https://2.bp.blogspot.com/-VwXePvYqaJg/Wiyh_IRAKOI/AAAAAAAABSM/YsdcLNtShKcXdrE_z2mx5FG_FUpTA0p-ACLcBGAs/s1600/testweb_lwip03_2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
このプログラムはWebブラウザで入力されたRGBの色の値をRM57に送り、LCDディスプレイにその色で描画するといったものですが。自己満足は十分に満たしたものとなっています。<br />
<br />
<br />
<br />
<br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-77910089634751155522017-06-21T14:55:00.001+09:002017-06-21T14:55:18.789+09:00IoT事始め 遅ればせながら、IoTを体験したいと思い、Texas Instruments LaunchPad(LAUNCHXL2-RM57L) の デモアプリケーションを試してみました。<br />
<br />
このデモアプリケーションでは、HTTPDの機能、DHCPからのIPアドレスの取得、シリアル通信によるログ出力が実現されています。<br />
<br />
○デモアプリケーション(開発環境、ソースコード)を TI Wikiよりダウンロード。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-l0DInRpe2Wg/WUnY5WbiR4I/AAAAAAAABQY/_L4vjFZI0Rk8MHRni08B23pvd37nZWKYwCLcBGAs/s1600/TI_Wiki_RM57_IwIP.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="559" data-original-width="1319" height="135" src="https://1.bp.blogspot.com/-l0DInRpe2Wg/WUnY5WbiR4I/AAAAAAAABQY/_L4vjFZI0Rk8MHRni08B23pvd37nZWKYwCLcBGAs/s320/TI_Wiki_RM57_IwIP.png" width="320" /></a></div>
<br />
※(http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM57L:_lwIP_Demo)<br />
<br />
<br />
○開発環境の整備<br />
・Code Composer Studio(CCS)は Version: 6.2.0.00050 にアップデート<br />
・HALCoGen は Window10で一部の画面表示が乱れるので、Windows7 で インストール(アップデート)を行いました。(Window10で一部の画面表示が乱れはかなり少なくなっていますが、まだ使用には耐えられないようです。)<br />
○デモアプリのダウンロード<br />
・デモアプリをダウンロードし展開<br />
(フォルダ「<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">HALCoGen EMAC Driver with lwIP Demonstration\</span><span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;">v00.03.00¥</span></span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">」に実行ファイル、ソースコードが展開されます。)</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">(HALCoGenのサブパッケージもインストールされるようです。前述のアップデートは不要かも?ここでアップデートも行われるかも?)</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">○</span>HALCoGen によるRM57のコンフィグレーション<br />
・GIO、SCI1、MIIおよびPINMUXの設定を行いました。ただひたすら、Wikiの説明通りの修正作業となりました。<br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> (from MII_RX_AVCLK4 to MII_RXCLK....の記述がいまいち不明で </span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">balls T4, U7</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> の</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">MII_RXCLK、</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> </span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">MII_TX_CLKを選択。)</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> ・RM57Lのコンフィグレーションソースの生成</span><br />
○CCSによるデモアプリの生成<br />
・Wikiの説明通りプロジェクトのインポート、コピーを行う。<br />
・HALCoGenの生成ソースコードへのリンクを行う。<br />
・<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">HL_phy_dp83640.h、</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">HL_sys_main.cを修正する。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">○</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">XDS110 Emulator</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">設定</span><br />
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px;"> ・</span></span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">targetConfigsフォルダの</span><span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;">RM57L8xx.ccxmlの修正</span></span><br />
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;"> 「RM57L8xx_0」を「RM57L8xx」に、「XDS110 USB Debug Probe_0」を「XDS110 USB Debug Probe」に修正。</span></span><br />
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;">○デバッグ実行</span></span><br />
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;"> ・ターミナルソフトをCOM3、9600BPSで立ち上げ実行</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-0J900LTB7bM/WUn4OduglKI/AAAAAAAABQo/JB_0YaRfOKc7KI3CS3lzOe2oZ_eOhyWSwCLcBGAs/s1600/Term0.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="547" data-original-width="822" height="212" src="https://3.bp.blogspot.com/-0J900LTB7bM/WUn4OduglKI/AAAAAAAABQo/JB_0YaRfOKc7KI3CS3lzOe2oZ_eOhyWSwCLcBGAs/s320/Term0.png" width="320" /></a></div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;"><br /></span></span>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px;"><br /></span></span>
<span style="background-color: white; color: #252525; font-family: sans-serif;"><span style="font-size: 14px;">※</span><span style="color: black; font-family: Meiryo; font-size: small;">LAUNCHXL2-RM57Lはネットに接続していないのでDHCPからのIPアドレス取得エラーが表示されているが、一応稼働しているらしい。</span></span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /><br /><br /><br /><br /><br />○ちょっと修正</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> 最初、LauchPadへの接続が不調で、過去に作成した、RM57Lプロジェクトにこのデモアプリケーションのソースを組み込み。なんとか、IoTの実現の第一歩にたどりついた様子を掲載します。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-o7YNPweaJ9g/WUn8IzfrYUI/AAAAAAAABQ4/1_ORTU6m5HEr4VaLYytHfq6HQ7RNOH4OACLcBGAs/s1600/IwIPDemo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="712" data-original-width="478" height="320" src="https://1.bp.blogspot.com/-o7YNPweaJ9g/WUn8IzfrYUI/AAAAAAAABQ4/1_ORTU6m5HEr4VaLYytHfq6HQ7RNOH4OACLcBGAs/s320/IwIPDemo.png" width="214" /></a></div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">※今回のデモアプリケーションにBOOSTXL-K350QVGへの表示機能を追加したアプリケーション。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-JydaexZggNU/WUn97fLE3-I/AAAAAAAABRE/SKQ3izj3k7ooYQI1su6vYuQKS2iIQLBtgCLcBGAs/s1600/Term1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="547" data-original-width="821" height="213" src="https://1.bp.blogspot.com/-JydaexZggNU/WUn97fLE3-I/AAAAAAAABRE/SKQ3izj3k7ooYQI1su6vYuQKS2iIQLBtgCLcBGAs/s320/Term1.png" width="320" /></a></div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">※ルータにLaunchPadを接続して、デバック実行</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> DHCPによるIPアドレスの取得に成功している。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-zo8rrIPvg5Y/WUn-_ZrhQaI/AAAAAAAABRQ/ik2olJ9n43Iv600BHxDz6QWxSLup33jqACEwYBhgL/s1600/TestHTML.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1002" data-original-width="1092" height="293" src="https://4.bp.blogspot.com/-zo8rrIPvg5Y/WUn-_ZrhQaI/AAAAAAAABRQ/ik2olJ9n43Iv600BHxDz6QWxSLup33jqACEwYBhgL/s320/TestHTML.png" width="320" /></a></div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">※WebブラウザでLauchPadにアクセスする。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">表示されている内容は、Cのソースコードに変換して、プログラムで定義されたデータの形で扱われている。(固定の表示)</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">◇コンパイルエラーが多少出る。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> ・HL_pinmux.c の pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_ | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2; でコンパイルエラー</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"> 対処:PINMUX_BALL_R4_を削る。 など</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px;">◇Launch Padのパッケージを開封した際、MACアドレスが同封されていることを期待していたのですが、、、、残念、古い古い、ノートPC(Win95)のEtherNetカードのMACアドレスを流用しようと思います。(ローカルで使う分には、何を使おうが関係ないのですが。。。。)</span></span><br />
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px;"><br /></span></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">◇今後は、RM57Lとの</span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">データやパラメータの送受信が </span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;">HTTPDを介して 実現できたらと思います。</span><br />
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /><br /><br /><br /><br /><br /></span>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px;"><br /></span>
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-42234362162762648092015-08-28T15:04:00.002+09:002015-08-28T15:04:55.941+09:00LaunchPad ブースターパック(TFT液晶)を試しました。 その2MSP432 LaunchPad 用の BoosterPack を RM46x LaunchPad に 試してみました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-O0ET7Jysq5M/Vd_vpfv9CFI/AAAAAAAABPI/4yce4rnaJl8/s1600/TestColorLCD0.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-O0ET7Jysq5M/Vd_vpfv9CFI/AAAAAAAABPI/4yce4rnaJl8/s320/TestColorLCD0.jpg" width="213" /></a></div>
これらのLaunchPadは、BooserPackに使用するピンヘッダーの機能が共通なので、LM4F120 LaunchPad のように ピンの変換を行う必要はありません。<br />
ただ、BooserPack BOOSTXL-K350QVG-S1 に RM46用のサンプルが無いだけだと思います。<br />
<br />
とりあえず、画面表示に挑戦してみました。<br />
<br />
ポイントは、<br />
・SPI 機能は MibSPI3 モジュール を使用 <br />
ただし動作モードはSPIモード(MibSPIモードでは行わない。)<br />
・GPIO 機能は 少々面倒<br />
SPI CS ピンは直接 GPIO(GIO)を使えません。<br />
High-End Timer (N2HET) モジュールのGIO機能を使う。<br />
・HALCoGenに慣れること。<br />
<br />
<br />
<br />
<br />
<br />
<br />
HALCoGenの設定<br />
<br />
SPIの設定 <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-91jw3NoOeKk/Vd_0-_X4BxI/AAAAAAAABPc/yt67i22asog/s1600/SPI_Conf0.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://1.bp.blogspot.com/-91jw3NoOeKk/Vd_0-_X4BxI/AAAAAAAABPc/yt67i22asog/s320/SPI_Conf0.jpg" width="320" /></a></div>
*MIBSPI3とSPI3は同じモジュール(としてあつかう。?)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
SPIの設定2<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-P3wth8bog4I/Vd_1BHi4SEI/AAAAAAAABPk/gXlBghWQ8NQ/s1600/SPI_Conf1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/-P3wth8bog4I/Vd_1BHi4SEI/AAAAAAAABPk/gXlBghWQ8NQ/s320/SPI_Conf1.jpg" width="320" /></a></div>
*DataFormat 0 を設定。<br />
*ボーレートを16MHzで設定<br />
*ClockPolarityをチェック<br />
(SPI MASTERとなる。)<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
ピン設定<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-v_m6yngF3eg/Vd_1FkywnRI/AAAAAAAABPs/-gK58N4hbHo/s1600/SPI_Conf2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://1.bp.blogspot.com/-v_m6yngF3eg/Vd_1FkywnRI/AAAAAAAABPs/-gK58N4hbHo/s320/SPI_Conf2.jpg" width="320" /></a></div>
*SPI SIMO CLKのピン設定<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
SPI コーディング<br />
<br />
spiDAT1_t dataconfig_t;<br />
uint32 blocksize;<br />
<br />
// DataFormat 0 を指定<br />
dataconfig_t.DFSEL = SPI_FMT_0;<br />
<br />
dataconfig_t.CS_HOLD = true;<br />
dataconfig_t.WDEL = false;<br />
dataconfig_t.CSNR = 0;<br />
<br />
blocksize = 1;<br />
<div>
<br /></div>
・・・・・・・・・<br />
uint8_t dat;<br />
<br />
・・・・・・・・・<br />
//SPI 出力<br />
uint16 srcbuff[8];<br />
srcbuff[0] = dat;<br />
spiTransmitData(spibase,&dataconfig_t,blocksize,srcbuff);<br />
<br />
<br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-23045102734013263652015-08-28T14:17:00.000+09:002015-08-28T14:17:25.240+09:00高性能 LaunchPad を試しました。 <div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0381CTwT91M/Vd_TXX_8TwI/AAAAAAAABOo/X3_1of-Ddoo/s1600/LaunchPad_RM46.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="196" src="http://3.bp.blogspot.com/-0381CTwT91M/Vd_TXX_8TwI/AAAAAAAABOo/X3_1of-Ddoo/s320/LaunchPad_RM46.jpg" width="320" /></a></div>
<div>
MCUのクロックスピードが220MHz、FlashROM 1.25MB RAM 192KB デジキーで購入できる最高スペックのLaunchPad(2015年8月時点) を購入しました。</div>
</div>
<div>
<br /></div>
<div>
届いたLaunchPadを開封すると、MSP430に比べ小さいパッケージに、どでかいボード(MSP430の2.5倍)が窮屈そうに入っていました。</div>
<div>
早々、にUSBケーブルでPCにつなぐと2つのLEDが異なった周期点滅。</div>
<div>
以下の操作でLEDの点滅が変化</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
・LightSensor を指で 隠すと LED B の点滅が遅くなる。 </div>
<div>
・UserSW Aを押すと、 LED Aの点滅が早くなる。</div>
<div>
・<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Baud Rate: 19200, Data Bits: 8, Stop Bits: 2 and Parity: None. でターミナルソフトにつなぐと、ガイダンスが出力される。</span></div>
<div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></div>
<div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"> 次に、LED チカチカの もっとも簡単なプログラムを作成にトライしました。(いきなり)</span></div>
<div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">・Code Composer Studio(CCS)でワークグループを作成し、プロジェクトの新規作成を。</span></div>
<div>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"> => Target の <select or="" type....=""> でRM46ファミリを探すが見つからない。</select></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"> => 再度 CCSをインストールし直す。(結果同じ) </span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">・</span></span><span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">http://processors.wiki.ti.com/index.php/LAUNCHXL2_RM46:_Project_0 を 参考にする。</span></div>
<div>
<span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"> =>RM46 対応の </span><span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Target Configuration File を作成する。(プロジェクト作成の前。)</span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"> =>HAL Code Generator を インストール</span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"> =>サンプル Project0を 作成 ここで、Taget の 個別のMCUの選択リストにRM46があることに気づく。</span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"><br /><div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6akxo5gd0qw/Vd_oHzlgZ8I/AAAAAAAABO4/D3m0yEQ6rQQ/s1600/HerclesDevlop.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="181" src="http://2.bp.blogspot.com/-6akxo5gd0qw/Vd_oHzlgZ8I/AAAAAAAABO4/D3m0yEQ6rQQ/s400/HerclesDevlop.jpg" width="400" /></a></div>
</span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Hercules RM46x LaunchPad の 感想</div>
<div>
<br /></div>
<div>
・IO ピンが多い、ほぼすべてのMPUのピンが利用可能。</div>
<div>
・サンプル(デモ)プログラムがほとんど無い。 </div>
<div>
CCSプロジェクトファイル、プログラムソースに加え、HALCoCen. プロジェクトファイルがそろった、サンプルプログラムが提供れる事を期待。</div>
<div>
・sys_main.c が 邪魔。 システム、各ペリフェラルのパラメータを HALCoCen. で 修正するたびに sys_main.cが出力 main.cと かぶり 邪魔になります。</div>
<div>
・デジキーの価格設定が高い。TI ではほぼ20ドル が 4、721円 Hercules RM57L LaunchPadの価格では?と 。。。。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
</div>
<div>
</div>
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-69157175122900319312015-08-21T15:02:00.000+09:002015-08-21T15:02:24.656+09:00LaunchPad ブースターパック(TFT液晶)を試しました。 MSP432 LaunchPad 対応のBoosterPack (BOOSTXL-K350QVG-S1 Kentec QVGA Display)を購入しました。<br />
早速、MSP432に搭載、デモアプリ BOOSTXL-K350QVG-S1_GrlibExample_MSP432P401R を試しました。<br />
<br />
このデモアプリ<br />
最初 4隅に赤○の表示、これを 順にタッチして、メインメニューが表示、ボタン選択で、テストグラフィックの表示、TIロゴの表示を行います。<br />
<br />
さて、このブースターパック、過去に悪戦苦闘して、TFT液晶を表示させてきた事を思い起こすと、結構すぐれもののアイテムだと気付きました。<br />
<br />
今まで、TFT液晶表示を行おうとすると、TFT液晶のフレキケーブルの扱い、バックライトLEDの昇圧回路の作成等、手間暇とコストが結構かかりました。(特に実体顕微鏡での半田づけが大変)<br />
このBoosterPack、TFT液晶の入出力IFは 2.52mmの2×10のピンフレーム(ソケット)が2個、タッチパネル付き、それが、デジキーで3500円前後 正に理想的なアイテムです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-1-eQIxsCYK8/Vda3oOsfoqI/AAAAAAAABOY/12bXOsAtdiM/s1600/MSP432_150802.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="175" src="http://2.bp.blogspot.com/-1-eQIxsCYK8/Vda3oOsfoqI/AAAAAAAABOY/12bXOsAtdiM/s320/MSP432_150802.jpg" width="320" /></a></div>
そこでBoosterPackを 単にTFT液晶モジュールとして試しました。<br />
デモアプリを CCSで LM4F120XL 用に修正し デバッグ開始、するとタッチパネル キャリブレーション画面の表示後、メインメニューが表示されました。<br />
<br />
(ただ現時点では、タッチパネルの扱いが不調で、キャリブレーション画面のチェックはスルーしてしまいます。)<br />
<br />
<br />
<<MSP432 => LM4120XLの変更点>><br />
・SPI UCB0 => SSI0<br />
・ADC 14Bit ADC(A13,A14) ⇒ 12Bit ADC(AIN1,AIN2) ※<br />
・GPIO(SDC) P4.6 => PD3<br />
・・・・・・・・・・・・・・・・・・・・・・・・<br />
<br />
※ADC関連のパラメータは 1/4 に(適宜)<br />
<br />
<br />
<br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-67515335677913647392015-08-21T13:27:00.001+09:002015-08-21T14:04:20.695+09:00黒のLaunchPad(MSP432)を試しました。 TIのサイトをチェックしていたら。MSP432なるMCUがリリースされているのに気付きました。<br />
手軽に使えたMSP430の32ビット版 勝手知ったる ARM Cortex-Mシリーズ (<span style="background-color: white; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: -webkit-center; white-space: nowrap;">ARM® Cortex®-M4F) </span>さらに、LauchPadがデジキーで購入可能。早速購入、デモアプリを試しました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Fr7cTAfGhZ4/Vdad0tV9lvI/AAAAAAAABN4/f-zw6i74uAg/s1600/MSP432_150800.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="179" src="http://1.bp.blogspot.com/-Fr7cTAfGhZ4/Vdad0tV9lvI/AAAAAAAABN4/f-zw6i74uAg/s320/MSP432_150800.jpg" width="320" /></a></div>
<br />
開発環境のCCS ver.6.1も問題無く導入完了(TIの場合、開発環境のダウンロードで一旦メールを受け取らなければいけない。これを忘れると。TIのサイト内で堂々巡りをすることになります。今回同じメールを3通受け取りました。。。。)<br />
<br />
デモアプリは、PCのGUIアプリの操作で点滅LED(LED2)の色、点滅間隔を変化させます。<br />
(PC GUIアプリで R:0 G:0 B:140 を指定、LauchPadのLED2点滅を青に、)<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-0EKgMx1G7pQ/VdamhrEeXbI/AAAAAAAABOI/2Kt204xXbjs/s1600/MSP432_150801.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="273" src="http://1.bp.blogspot.com/-0EKgMx1G7pQ/VdamhrEeXbI/AAAAAAAABOI/2Kt204xXbjs/s320/MSP432_150801.jpg" width="320" /></a></div>
そのほか、<br />
・UART機能 <br />
LauchPad(MSP430)経由で確認 <br />
・Stellaris LM4F120XL プログラムの移植<br />
グラフィク液晶表示(SG12864)の移植<br />
==>成功<br />
SDカード読み込みの移植(SPI機能)<br />
==>目下のところ不調<br />
<br />
<br />
MSP432の使い勝手は普通!!・・・・まだ、簡単なテストプログラム段階ですが、何の違和感も無く、プログラム開発が出来ました。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-12328115840768338482013-03-11T14:43:00.001+09:002013-03-11T14:44:07.742+09:00LaunchPad UART,UART,UART,,,, Texas Instruments MSP430G2553のUART機能を試しました。しかし、ほんの些細なことに気付けず、お手上げ一歩手前、結構手こずりました。<br />
以下に、その顛末を記します。<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-J_For0s06Hs/UTxwhR_ezkI/AAAAAAAABJ8/Zvzx8DsEgnI/s1600/UART001.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-J_For0s06Hs/UTxwhR_ezkI/AAAAAAAABJ8/Zvzx8DsEgnI/s1600/UART001.jpg" height="320" width="255" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">UART機能を使う場合、Tx/Rxをクロス配線</td></tr>
</tbody></table>
1.Software UARTの検証<br />
もともと、MSP430LaunchPadには、UART機能の無い、MSP430G2231が付属していてデモプログラムはPCとの間でSoftUARTによる通信を実現していました。<br />
そこで、MCUをUART機能を持つMSP430G2553に置き換え、Software UARTを試すことにしました。<br />
1)CCS Ver4で新規プロジェクトを作成、<br />
作成時のProject Templatesで [Grace Examples/Hello world via software UART]を選択<br />
2)実行(Debug)<br />
PCのターミナルソフト(ボーレート2400)で「Hello world.」を確認<br />
2.UART機能の検証<br />
まずは、送信(TX)のみのプロジェクトを作成。<br />
1)新規プロジェクトを作成。<br />
作成時のProject Templatesで[Empty MSP430 Grace Project]を選択<br />
2)GraceでUART機能を設定<br />
Grece Device OverViewで[USCI A0 UART...]を選び、UARTの端子設定、ボーレート設定を行いました。<br />
3)実行(Debug)<br />
software UARTと同様にPCのターミナルソフトでMSP430からの通信を待つが音沙汰なし。<br />
4)試行錯誤<br />
まず、P1.1、P1.2のピンの設定に問題があると思い、GraceでGPIOの設定を先に、その後UART設定を行う。Graceでの設定と、src/csl/GPIO_init.c等のソースコードの内容に祖語があると思いジタバタ、(プロジェクトのビルドでGraceの設定内容がソースコードに反映されることに気付くのは結構経ってから)<br />
UARTのボーレートが正しく設定されていないと思い、Basic Clock System(BCS)の設定を1、8、12、16MHzで試す<br />
等々、試行錯誤を繰り返す。<br />
<br />
3.「え! こんなことが。。。」<br />
試行錯誤を散々繰り返した、もう、MSP430のUART機能はデータシートだけの機能とあきらめ、BaseBoadを作成、一応、UARTの入出力Pinを用意、LCD表示を確かめた後、だめ元で、UART機能をBaseBoad上で試す。すると、PCのターミナルソフトに「Hello world.」の表示が、、「え! なんで」と言う気持ちになりました。<br />
<br />
そこで、BaseBoad上のMSP430をLaunchPadに戻して、UARTの通信を確かめると、沈黙<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-80gDickIyYY/UTxwiqD0F9I/AAAAAAAABKE/TUXQHHyV8-s/s1600/UART002.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-80gDickIyYY/UTxwiqD0F9I/AAAAAAAABKE/TUXQHHyV8-s/s1600/UART002.jpg" height="206" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Stellaris-MSP430 UART</td></tr>
</tbody></table>
つくづくLanchPadを眺めると、P1.1(TXD)、P1,2(RXD)の表記に目が留まりました。<br />
「うそ!TX/RX 逆じゃないか!!」<br />
つまり、LaunchPad MSP430 デモプログラムのSoftwareUARTのTX/RXピン構成が、MSP430G2553のUARTのTX/RXピン構成と逆になっているということです。<br />
そこで、LaunchPad上のTX/RX配線をクロスさせ、試行錯誤で作成したプログラムを試すと殆どがUARTの機能が実現されていたことを確認しました。<br />
<br />
<br />
4.Stallaris UART<br />
Stallaris LM4F120 のUART機能はさほどの苦労もなく試すことが出来ました。試したプログラムは SDカードのテキストファイルを読み込み、1行ごとにUART出力、これをMSP430で受けてLCD表示するといったものです。<br />
<br />
<br />
Memo<br />
1.MSP430のUART 受信(RX)は1バイト毎のRX割り込みで取り込み。<br />
初め、RX(UCA0RXIFG)割り込みフラグクリアまで受信データを取り込む形で試しました。すると、受信データの最後の1バイトのみ取り込んだ結果になりました。<br />
そこで、いろいろ試しているうちに、受信データのバイト数分RX割り込みが発生することがわかり、割り込み毎に1バイトづつ取り込むように修正、あとは、受信データの終わりの認識方法をどうするか、、、タイマを使い周期的に受信バイト数の監視を行い、増減なしで受信完了の処理を行うようにしました。<br />
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-41080931214277970252013-02-06T15:59:00.000+09:002013-02-06T15:59:11.082+09:00LPC1114 System Oscillator を試しました。NXP LPC1114 のUART機能検証を続けています。まず、これまでに現れた不具合は、<br />
・LPC1114のUSRT設定 <br />
LPC1114側のボーレート115200で PC側ターミナルソフトで文字化けが起こる。<br />
LPC1114側のボーレート9600で、PC側(115200)で正常な通信を確認。<br />
・Systick設定<br />
Systick割り込みインターバルが想定の1/2<br />
<br />
ということで、システムクロックの設定について何か問題でもあるのかとも思いました。<br />
もともとNXP他が提供するサンプルソースはSystem Osillator(外付けクリスタル)をクロックソースにしていて、これをIRC Oscillator にして機能検証を行っていました。<br />
<br />
そこで、クロックソースをSystem Oscillatorに戻して、これまでの検証を繰り返しました。(手持ちの水晶発振子が8MHzだったのでそれを使用)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-9uFvwXtKbEU/URHx92HwStI/AAAAAAAABJk/e-qhN-TMt0E/s1600/SysClock8M.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="http://1.bp.blogspot.com/-9uFvwXtKbEU/URHx92HwStI/AAAAAAAABJk/e-qhN-TMt0E/s320/SysClock8M.jpg" width="320" /></a></div>
<br />
LPC1114各レジスタ設定値<br />
<LPC1114 UART設定:ボーレート9600 Systick設定:480000><br />
システムPLL制御レジスタ(SYSPLLCTRL) 0x25 MSEL:5 (M=6) PSEL:4(P=4) <br /> システムPLLステータスレジスタ(SYSPLLSTAT) 0x01 PLL はロック状態 <br /> システムオシレータ制御レジスタ(SYSOSCCTRL) 0x00 オシレータはバイパスされません。/周波数範囲1 ~ 20 MHz <br /> システムPLLクロックソース選択レジスタ(SYSPLLCLKSEL) 0x01 システムオシレータを選択 <br /> メインクロックソース選択レジスタ(MAINCLKSEL) 0x03 システムPLL クロック出力を選択 <br /> システムAHBクロック分周器レジスタ(SYSAHBCLKDIV) 0x01 1 で分周 <br /> システムAHBクロック制御レジスタ(SYSAHBCLKCTRL) 0x1105F <br />
これらの設定でメインクロック48MHz稼働を確認しました。<br />
<br />
UARTクロック分周器(UARTCLKDIV) 0x01 <br /> UARTライン制御レジスタ(U0LCR) 0x03 8 ビットの文字長/1 ストップビット/パリティなし/DLAB=0 <br /> UART分数分周器レジスタ(U0FDR) 0x10 DIVADDVAL=0/MULVAL=1<br /> UARTボーレート分周器レジスタ(U0DLL) 0x00 <br /> UARTボーレート分周器レジスタ(U0DLM) 0x05 DL=0x0500<br />
これらのUART設定では、ボーレートは2343となりそう。<br />
BaudRate = 48M/(<span style="color: red;">16</span>*0x0500) = 2343<br />
<br />
システムtick カウンタ校正レジスタ(SYSTCKCAL) 0x04 システムtick タイマ校正値0x04 <br /> システムタイマリロード値レジスタ(SYST_RVR) 0x752FF RELOAD <br /> システムタイマ校正値レジスタ(SYST_CALIB) 0x04 TENMS=0x04 default値<br />
これらのSystick設定では、Systick割り込み間隔は 20mSになりそう。<br />
Systick割り込み間隔 = 0x752FF/(48M*<span style="color: red;">1/2</span> ) = 0.02 Sec.<br />
<br />
計測内容<br />
・UARTのTX信号を測定すると、ビット巾は約0.1mSであった。<br />
、 実際のUARTのボーレートは、9600であった事が確かめられた。<br />
PC側のボーレート設定9600のターミナルソフトでUART通信を確認。<br />
(PC側ボーレート115200でもUART通信が成立してしまうことを確認、前回、LPC1114側でボーレートを9600に設定すると115200のボーレートになると考えたことは、誤り。)<br />
<br />
・Systick割り込みでGPIOのHigh/Lowを出力すると、High、Lowそれぞれの巾は10mSであった。<br />
<br />
<br />
その他、<br />
UARTでボーレートを115200にした場合やはり、PC側で文字化けを起こした。(前回と同じ)<br />
ボーレートは115200付近であろうと思われ、 UART分数分周器レジスタ(U0FDR)でボーレートの微調整を試しましたが、不調に終わりました。<br />
<br />
LPC111xのデータシートでは システムオシレータの範囲は1~25MHzでした、しかしユーザーマニュアルでは一部10MHz~25MHzの表記があります。ドキュメント内、ドキュメント間で整合性がとれていないのではと思います。<br />
<br />
まとめ、<br />
サンプルコードを利用したUART設定でボーレートは正しく設定された。ただし、ユーザーマニュアルのレジストリ設定と実際のレジストリ設定で食い違いがあるように思える。<br />
また、Systick設定では、ユーザーマニュアルの「システムtick タイマクロックはシステムクロック1/2」という事は実際と異なると思われる。<br />
<br />
<br />
現時点でのLPC1114のアプリケーション開発はユーザーマニュアルより、NXP等から提供されるサンプルコードを優先して参考にしたほうがよさそうです。<br />
<br />
<br />
<br />
<br />
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-24340528482786742612013-02-04T22:46:00.000+09:002013-02-04T22:46:21.775+09:00TI LaunchPad 電子温度計 その後以前作成した、TI Stellaris LaunchPad 電子温度計の動作確認を行いました。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-DWORLkgOFWs/UQ-pCYoW8bI/AAAAAAAABJE/P8_waFdRgUc/s1600/Thermometer_5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="213" src="http://3.bp.blogspot.com/-DWORLkgOFWs/UQ-pCYoW8bI/AAAAAAAABJE/P8_waFdRgUc/s320/Thermometer_5.jpg" width="320" /></a>まず準備したものは、観賞魚用小型水槽、ヒータ、水中ポンプ。 水8リットル(5℃)を水槽にいれ、そこに電子温度計につないだヒータ(300W)、循環用に水中ポンプを設置しました。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://1.bp.blogspot.com/-0PeHLa9iEyc/UQ-pFSpcOSI/AAAAAAAABJM/D19IuF1gz2Y/s1600/Thermometer_4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="193" src="http://1.bp.blogspot.com/-0PeHLa9iEyc/UQ-pFSpcOSI/AAAAAAAABJM/D19IuF1gz2Y/s320/Thermometer_4.jpg" width="320" /></a>電子温度計に40℃の温度設定をすると、ヒータのスイッチが入り、徐々に水槽の水温が上昇しました。あとは、設定温度+αでスイッチが切れるのドキドキしながら待ちました。さて水温が40℃に到達、しばらくしてヒーターのスイッチが切れました。まず第一段階クリア。</div>
<div class="separator" style="clear: both; text-align: left;">
ヒータのスイッチが切れた後、水温は惰性で若干上昇後、緩やかに下降を始めました。設定温度の40℃を切ったところで再度ヒーターのスイッチが入り所定の動作確認が出来ました。</div>
<div align="left" class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Q5XRQD3GJj8/UQ-pLZw72-I/AAAAAAAABJU/AX-68kHpt9w/s1600/Thermometer_6.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="228" src="http://1.bp.blogspot.com/-Q5XRQD3GJj8/UQ-pLZw72-I/AAAAAAAABJU/AX-68kHpt9w/s320/Thermometer_6.jpg" width="320" /></a></div>
●最初の設定<br />
測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃) <br />
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)<br />
<br />
水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化 <br />
<br />
●温度調整巾 0.4に変更<br />
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)<br />
<br />
水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。<br />
<br />
今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。<br />
<br />
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-46306922489859963702013-02-03T17:39:00.000+09:002013-02-03T17:39:05.922+09:00LPC1114 システムクロックについて(Systick)LPC1114FN28のシステムクロック設定の検証を続けています。<br />
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。<br />
<br />
Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。<br />
<br />
1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。<br />
1)サンプルコード systicktest.c について<br />
以下のコードで 10mS でSystick割り込みを実現しています。<br />
#define SYSTICK_DELAY (SystemCoreClock/100)<br />
SysTick_Config( SYSTICK_DELAY );<br />
2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。<br />
void SysTick_Handler(void)<br /> {<br /> int i;<br /> TimeTick++;<br /> TimeTick &= 0x7fffffff;<br /> i = TimeTick & 0x01;<br /> GPIOSetValue( 1, 4, i );<br /> }<br />
3)GPIO出力周波数測定。<br />
測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)<br />
Systickの設定を 10μS にして実行 測定周波数 49700Hz<br />
#define SYSTICK_DELAY (SystemCoreClock/100000)<br />
<br />
また、メインクロックは48MHzであった。<br />
こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。 。。。。?<br />
<br />
<br />
<br />
※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。<br />
、white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-48024941187202304662013-02-03T00:21:00.003+09:002013-02-03T00:21:42.416+09:00LPC1114 UART及びメインクロックの確認トラ技付録LPC1114でUARTの機能を以下の手順で検証しました。<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LCH1pqoJIfI/UQ0ssxhy98I/AAAAAAAABIk/_DIjxKTARRI/s1600/DispMainClock.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-LCH1pqoJIfI/UQ0ssxhy98I/AAAAAAAABIk/_DIjxKTARRI/s320/DispMainClock.jpg" width="285" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">メインクロックの表示</td></tr>
</tbody></table>
<br />
<br />
1.プログラムコードの入手<br />
NXPからサンプルコード「lpc11xx.keil-examples-CMSIS-update.zip」を入手し、以下のプログラムコードを抽出利用しました。<br />
・uarttest.c フォルダUART<br />
・uart.c、core_cm0.c フォルダCommon/src <br />
・uart.h、type.h フォルダCommon/inc<br />
2.Keil uVision4で新規プロジェクトTestUART01を作成ビルド<br />
・上記のサンプルコードファイルをプロジェクトTestUART01に追加<br />
・system_LPC11xx.cは、GPIOを試したプロジェクトで使用したものをプロジェクトTestUART01に追加<br />
3.プロジェクトTestUART01をデバッグ<br />
1)サンプルコードそのままで実行<br />
・PCのターミナルソフトでUARTの通信は確認できなかった。<br />
2)ボーレートを遅くして実行<br />
・UARTInit();によるボーレート指定を 115200から9600に変更した。<br />
・最初、1)と同様にUARTは沈黙、、、いろいろもがくうちに、たまたま、PCのターミナルソフトのボーレートを115200で試すと、本来のUARTの動作が確認出来ました。<br />
<br />
<br />
LPC1114のボーレートが9600、PC側のボーレート115200でUARTの送受信が確認出来ました。<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-bROy70BjReQ/UQ0svUr_KUI/AAAAAAAABIs/Z4Bmre4OAzc/s1600/UART_BaudRate.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="212" src="http://3.bp.blogspot.com/-bROy70BjReQ/UQ0svUr_KUI/AAAAAAAABIs/Z4Bmre4OAzc/s320/UART_BaudRate.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">初めてUARTの動作確認</td></tr>
</tbody></table>
後は、LPC1114側のUART設定かメインクロックの設定の問題と思い、プログラムコードを点検しました。(特にメインクロックの設定はもともとクロックソースとしてシステムクロック(外部)であったのをIRCクロックに変更したので要注意)<br />
<br />
4.プログラムコードsystem_LPC11xx.cの確認<br />
1)システムPLL 制御レジスタ(SYSPLLCTRL)設定とメインクロック(SystemCoreClock)の計算に誤りと思われるコードがある。<br />
<br />
<br />
SYSPLLCTRLの設定値は0x00000023で分周比M=4 ポスト分周比P=2となりIRCクロック12MHzではメインクロックは24MHzとなるはず、<br />
しかしsystem_LPC11xx.cのSystemCoreClockUpdate()で計算されるメインクロックは48MHzとなりました。<br />
<br />
<br />
計算式<br />
SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);はレジスタSYSPLLCTRLのポスト分周比Pが考慮されていない。<br />
次のように修正した、<br /> SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1) / (0x01 << ((SYSPLLCTRL_Val & 0x060) >> 5) );<br /><br />
5.system_LPC11xx.c修正の検証<br />
ひとまずメインクロックの計算式を修正した段階でUARTの検証を行った、当然、計算されるメインクロックは2分の1の 24MHz となるので LPC側のボーレートは2倍になります。PC 側のターミナルソフトのボーレートを230400に設定しました。<br />
<br />
その結果は、文字化けが多発、一部の英数XYZ12345がエコーバックで表示出来ている。つまり、ボーレートに若干のずれがあると言うことでしょう。<br />
<br />
6.UARTボーレートの調整<br />
LPC1114とPC側のボーレート設定の不一致は、ひとまず棚上げ、LPC1114のボーレートの調整を行いました。<br />
ユーザマニュアルでUART 分数分周器レジスタ(U0FDR)の設定でボーレートの調整が出来ることがわかり試しました。<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-GA3JmNEx6UI/UQ0swtaelHI/AAAAAAAABI0/ZMp8TxTBBoE/s1600/UART_BaudRate2.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="189" src="http://3.bp.blogspot.com/-GA3JmNEx6UI/UQ0swtaelHI/AAAAAAAABI0/ZMp8TxTBBoE/s320/UART_BaudRate2.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">文字化けがなかなか解消されない。</td></tr>
</tbody></table>
その結果は、DIVADDVALを1に、MULVALを12にした場合 最も文字化けが少なくなるが依然、使用に耐えるレベルにない。<br />
<br />
<br />
<br />
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-60811704473836095952013-02-02T00:17:00.000+09:002013-02-03T15:30:26.114+09:00LPC1114FN28 GPIO でジタバタ 数か月遅れで、トラ技(2012年10月号)付録マイコンLPC1114を試しています。付録DVDにあったサンプルプログラム「MDK_sample」を修正して、各機能のチェックを行おうと思いました。<br />
<br />
<br />
第一歩GPIOを確かめてみました。<br />
これが不幸の始まり。<br />
<br />
<br />
まず、トラ技の記事の「端子配置/機能」(P60、P61)を眺め、パラレルデータインターフェース用に8ビットまたは4ビットのデータポートを確保しようと思いました。<br />
当然、PIO0_0~PIO0_7(ポート0)または、PIO1_0~PIO1_7(ポート1)のいずれかを使うことになります。しかし、PIO0_0、PIO0_1はRESETとISPへの切り替え用となっているので、ポート0はデータポートしては使えないと判断、またPIO1_6、PIO1_7はUART用に使われます、ポート1も使えない、、、、、、、(強引にPIO0_4~PIO0_11で8ビットのデータポートを確保するしかないのかと思いました。)<br />
<br />
8ビットデータインターフェースは諦め、一まず、次のように、4ビット(PIO1_0~PIO1_3)のデータポートを実現しようとしました。<br />
1.I/O設定(MDK_sample main.c)<br />
1)LPC_IOCON->PIO1_1 = 0xd0;を追加するがコンパイルエラーが発生次の通り修正<br />
LPC_IOCON->R_PIO1_0 = 0xd1;<br />
LPC_IOCON->R_PIO1_1 = 0xd1;<br />
LPC_IOCON->R_PIO1_2= 0xd1;<br />
LPC_IOCON->SWDIO_PIO1_3 = 0xd1;<br />
2)LPC1114に書き込めど、動かず、<br />
LPC_IOCON->PIOx_yで設定できるGPIOは動作確認できるが、それ以外のGPIOは不能となる。<br />
<br />
LPC_IOCON->R_PIOx_yについて、ユーザーマニュアル 6章「I/O設定」を繰り返し読む、レジスタの説明で[R機能]が優先、しかし[R機能]の意味が解らない、、、<br />
LPC_IOCON->SWDIO_PIO1_3について はシリアルワイヤデバッグ(SWD)のピンが優先、したがって、SWDの機能を無効にすればPIO1_3が使えるようになると思いました。<br />
しかし、ユーザマニュアルにSWDを無効にする方法もレジスタの表記も無い。NXPの他のドキュメントを繰るとCRP(Code Read Protection)の機能でSWDを無効に出来そうだと、、、、、<br />
<br />
<br />
2.CRPの設定<br />
1)アドレス0x000002FCに値0x12345678を書き込む。<br />
startup_LPC11xx.sを以下の用に修正<br />
<br />
・・・・・・・・・・・・・・・・・・<br />
IF :LNOT::DEF:NO_CRP<br />
AREA |.ARM.__at_0x02FC|, CODE, READONLY<br />
CRP_Key DCD 0xFFFFFFFF<br />
ENDIF<br />
<br />
CRP_Key DCD 0xFFFFFFFF を CRP_Key DCD 0x12345678 に変更<br />
2)FlashMagicでCRP1の設定を確認<br />
FlashMagic ISP/Read Security....でCRP1を確認(通常はCRP is disable)<br />
3)GPIO PIO1_3の出力を調べるが、不調<br />
依然として、High/Lowの出力が出来ない。<br />
<a href="http://2.bp.blogspot.com/-HWkDluI5YFQ/UQvXnLKN4RI/AAAAAAAABIU/M5OawfrCpno/s1600/FlashMagicISP2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-HWkDluI5YFQ/UQvXnLKN4RI/AAAAAAAABIU/M5OawfrCpno/s320/FlashMagicISP2.jpg" width="255" /></a> 4)プログラムのフラッシュの書き込み不能に。<br />
CRPに関するドキュメントでは、CRP1ではプログラムの書き込みは可能なはず、しかしFlashMagicでのプログラム書き込みは不能。またセクタ0の消去は不能(ドキュメント通り)<br />
そこで全消去をしようと思ったが、FlashMagicではそのような機能は無いようです。<br />
5)LPC1114 一つ廃棄<br />
LPC1114を試して1週間、最初の石は不能に、、、<br />
<br />
<br />
LPC1114について、ネットを調べまくると、多くのソースコードでLPC_IOCON->R_PIO1_0 の設定があります。LPC1114自体 PIO1_0はCRPなどの面倒な設定なしで普通に使えるはず。。。。<br />
問題は「Keil uVision4」でしょうか?「Keil uVision4」でR機能、SWD機能を前提にする環境があるのか、もしかしてGNU GCCを使えば このGPIOの問題は解決か。。。。<br />
<br />
3.GCCによる開発<br />
以前LPC2388のプロジェクトをひな形に、付録DVDのサンプルプロジェクトを参考に<br />
1)プログラムソース<br />
main.c<br />
cr_startup_lpc11.c (Rev.01 2011.04.17 Munetomo Maruyama)<br />
system_LPC11xx.c (17. November 2009 by ARM)<br />
2)memory.def<br />
ROM0000.ld(created from nxp_lpc13_c.ld (v3.1.4 (200912230917)) )をリネイム<br />
3)Makefile<br />
コンパイルオプション COMPILE_OPTS = -c <span style="color: red;">-mcpu=cortex-m0 -mthumb</span> <br />
ライブラリディレクトリ LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/<span style="color: red;">thumb</span> -L /usr/local/arm-tools/lib/gcc/arm-elf/4.6.3/<span style="color: red;">thumb</span> (GCCのインストールにより適宜に修正)<br />
4)動作確認<br />
今まで沈黙していたPIO1_0につないだLEDが点滅<br />
<br />
よし、GCCでのプログラム開発でLPC1114の全てのGPIO入出力に目途がたったと思いました。<br />
しかし、いままで集めたサンプルプロジェクト中から、使えそうなものを修正し、動作の検証を行ったところ、前述の「Keil uVision4」と同じGPIOの不調が起きました。その不調の原因を調べると、どうも使っていたsystem_LPC11xx.cが異なっていたことに気づきました。<br />
実際2つのsystem_LPC11xx.cを比較しても、GPIOの不調が起こるコーディングは見つけ出せない(現在)<br />
<br />
さてそうなると、前述の「Keil uVision4」が原因で起こるGPIO不調に疑問、、そこでプロジェクトのsystem_LPC11xx.cを見ると、GPIO不調のGCCプロジェクトのsystem_LPC11xx.cと同じでした。<br />
そこで、system_LPC11xx.cを置き換え、検証すると「Keil uVision4」のGPIOの不調は解消。<br />
<br />
<br />
まとめ<br />
●LPC1114で R機能、SWD機能の共有ピンの GPIO動作不調はsystem_LPC11xx.cによる。<br />
※「MDK_sample」のsystem_LPC11xx.c に System AHB clock 制御レジスタ (SYSAHBCLKCTRL)の設定を追加するとGPIO は正常に。<br />
追加コード<br />
#define AHBCLKCTRL_Val 0x0001FFFF<br />
LPC_SYSCON->SYSAHBCLKCTRL = AHBCLKCTRL_Val; ....(2013/2/3)<br />
<br />
<br />
●GCCでのビルド(make)では、コンパイルオプション<span style="color: black;"> -mcpu=cortex-m0 -mthumb</span> が必須<br />
またリンクするライブラリ(libc.a等)は <span style="color: black;">thumb配下のライブラリを指定。</span><br />
(LPC2388ではARM・thumbどちらでも可、LPC1114はthumbのみ可)<br />
<br />
●CRP(Code Read Protection)設定 CRP1は現時点で設定しない方がよい。<br />
<br />
<br />
<br />
<br />
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-60298291350131375452013-01-24T23:55:00.000+09:002013-01-24T23:55:25.411+09:00トラ技(2012-10)付録 LPC1114を試しました。 遅ればせながら、CQ出版 トランジスタ技術 2012年10月号 付録の NXP LPC1114を試しました。<br />
<br />
昨年 同誌をとりあえず購入、3か月余り書棚にしまいこんだままでした。しまいこんだ割には、その付録が気になっていました。付録は他の雑誌付録と違ってLPC1114単体、「一体どうやって使うのだろう?」 4KバイトのRAM、32KバイトのフラッシュROM、記事の通り「チョコット試す」にはもったいないようなスペック。<br />
今日、改めて記事を眺めてみました。すると、LPC1114を試すには、USB シリアル(RS232C、UART)のIFドライバIC、電源レギュレータ―等諸々、が必要であることが分かりました。<br />
入手できそうなIFドライバはFT231X(ICパッケージはSSOP-20)、電源レギュレータは手持ちかあるが結構手間取ることになりそう。<br />
ふと、傍らのTIのLaunchPad パッケージに目が止まりました。LunchPadを使えば、「USB-UART(Rx Tx)変換が簡単に利用出来そう!」「Vddの出力もある!」「USBドライバーのインストール不要!」 早速LPC1114のプログラミングに挑戦。以下にその顛末を述べます。 <br />
<br />
<div align="left" class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-jfLTpb_vV6M/UQExzpUdUfI/AAAAAAAABIE/zC4QrYnBZLs/s1600/StartLPC1114.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="168" src="http://3.bp.blogspot.com/-jfLTpb_vV6M/UQExzpUdUfI/AAAAAAAABIE/zC4QrYnBZLs/s320/StartLPC1114.jpg" width="320" /></a></div>
まず、開発環境の整備<br />
<br />
1.MDK-ARMのインストール(不要)<br />Interface誌付属 FM3基板を試したときインストールしたKeil uVision4の機能を確かめる。<br /> 新規プロジェクト作成で対応CPUをみると<br />LPC1114/201 ~ LPC1114/323 が対応していました。<br />そこで LPC1114/102 用にデバイスデータベースをインストールしました。<br />
1)付録CDで立ち上がるIE HTMLページでMDK-ARM_NXP_LPCxxxx.exeを実行<br />
2)Keil uVision4を再度立ち上げ新規プロジェクト作成<br />
Select a CPU Data Base Fileで「NXP LPC Family Device Database」が選択可能になり そこに登録されているLPC1114/102でプロジェクト作成が可能になりました。<br />
2.MyARM_sampleのインストール<br />
サンプルプログラムを入手するためインストールしました。<br />
3.Flash Magicのインストール<br />
サンプルプログラムによる、プログラム開発の実施<br />
<br />
<br />
<br />
<br />
4.LPC1114の周辺回路の構築<br />
・電源 Vdd、Vss 必須<br />
・UART Rx、Tx 必須<br />
・スイッチ SW1 (PIO0_1) SW2(Reset) 必須(ブートローダでISPを起動させるため・・・後述)<br />
・LED LED1(PIO0_7) LED2(PIO1_5) 適宜<br />
5.サンプルプログラムMDK-sampleをビルド/プログラム書き込み/実行<br />
<br />
<br />
メモ<br />
●Flash Magicでのプログラム書き込み。<br />
FlashMagic側) Baud Rateを115200に指定 InterfaceをNone(ISP)に<br />
PC側) デバイスマネージャでCOMポート ボーレートを1152000 に設定<br />
●書き込み失敗時<br />
SW1(PIO0_1) SW2(RESET)同時 Push後 再度書き込む。<br />
(CPUリセット時 PIO0_1がLowの場合 ISPが起動、UARTによるプログラムの書き込みが可能になります。)<br />
<br />
●トラ技2012-10号 P62 の図1の回路図でRXD/TXDの配線間違いがあるので注意<br />
(Flash Magicで、てこずった原因)white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-57764197516914828972013-01-15T23:36:00.000+09:002013-01-15T23:36:57.720+09:00NHD-C12864でチャート表示を試しました。<div class="separator" style="clear: both; text-align: left;">
<a href="http://4.bp.blogspot.com/-xHvg8jKxfwU/UPUr-03hxdI/AAAAAAAABHo/B8Jtwaa4WUI/s1600/Thermometer_3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-xHvg8jKxfwU/UPUr-03hxdI/AAAAAAAABHo/B8Jtwaa4WUI/s320/Thermometer_3.jpg" width="233" /></a> TI Stellaris LaunchPadで作成した電子温度計の表示をSUNLIKE社SG12864aの他、Newhaven Display NHD-C12864でも試しました。</div>
<div class="separator" style="clear: both; text-align: left;">
SG12864のデータインターフェースはパラレル、一方NHD-C12864はシリアル、当初、SG12864の方が、表示能力に勝ると思われたのですが、最小限の表示プログラム改造でNHD-C12864を稼働させると、遜色ない結果になりました。逆に、SG12864で起こる表示の乱れがNHD-C12864で起こらない満足いく結果になりました。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-Mr2BwJGUZCQ/UPUr-VzsZ7I/AAAAAAAABHk/6_02ZjB8Txw/s1600/Thermometer_2.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="195" src="http://1.bp.blogspot.com/-Mr2BwJGUZCQ/UPUr-VzsZ7I/AAAAAAAABHk/6_02ZjB8Txw/s320/Thermometer_2.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">NHD-C12864による温度チャート表示</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: left;">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-gUhobahaCOw/UPUr9q1cm1I/AAAAAAAABHc/eQbt_gDqfMM/s1600/Thermometer_1.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="236" src="http://1.bp.blogspot.com/-gUhobahaCOw/UPUr9q1cm1I/AAAAAAAABHc/eQbt_gDqfMM/s320/Thermometer_1.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SG12864による温度チャート表示</td></tr>
</tbody></table>
SG12864では頻繁に表示の乱れが起こり、各信号のタイミング調整でなんとか、対応しようとしています。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
NHD-C12864は、マイコンとのIFは5本(GPIO4本 /RES1本)、さらに、LCDドライバICが1つで、これがSG12864に較べ扱いやすいLCDとなっていると思われます。<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="clear: both; text-align: center;">
</div>
</div>
</div>
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-37616775682528501712013-01-15T00:06:00.000+09:002013-01-15T00:16:40.294+09:00グラフィックLCD NHD-C12864A1Zを試しました。<div align="left" class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-59MqGayFf4o/UPQD-XDEdcI/AAAAAAAABHE/pIey--t9jBk/s1600/NHD-C12864_1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="193" src="http://3.bp.blogspot.com/-59MqGayFf4o/UPQD-XDEdcI/AAAAAAAABHE/pIey--t9jBk/s320/NHD-C12864_1.jpg" width="320" /> </a></div>
Newhaven Display International社 グラフィックLCD NHD-C12864A1Z-FSB-FBWを試しました。<br />
これまではTI Stellaris LaunchPadでSUNLIKE社グラフィックLED SG12864 を使用していました。SG12864ではGPIOピンを13本占有するので、開発アプリケーションが自ずと制限されます。<br />
そこで、データインターフェースがシリアルのLCDを探したところ、DigiKeyでNHD-C12864A1Zを見つけ、早速に入手しました。<br />
<br />
NHD-C12864A1Zは、<br />
・マイコンとのインターフェースはGPIOピン4本でOK<br />
・0.1インチ(2.54mm)ピッチの12本のピン (6×2)<br />
・3.3V駆動 (No.9ピン H+ ヒータ用の12Vの給電があるが、いまいち不明?)<br />
<br />
<br />
最初、シリアルのデータインターフェースはSPI(SSI)やI2Cを使うと予想していたのですが、ドキュメントに記載された、初期化コードをみると、単純にGPIOのHi/Low出力でSCLとSI(SDA、Tx)を実現しているようで以下のコーディングを行いました。<br />
<br />
* シリアルによるデータ出力 1バイトの出力データ siout を シフトさせながら1ビットづつ出力<br />
<br />
for(i=0;i<8;i++)<br />
{<br />
lcd_SCL_low(); //SCL:Low<br />
if(siout & _10000000B)<br />
{<br />
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, LCD_PIN_SI); //SI:High<br />
}<br />
else<br />
{<br />
GPIOPinWrite(LCD_PORT_BASE, LCD_PIN_SI, 0); //SI:Low<br />
} <br />
lcd_SCL_high(); //SCL:High<br />
siout = siout <<1; //1ビットのシフト<br />
}<br />
<br />
<br />
*感想 <br />
・表示内容により、濃淡のムラがある。<br />
・比較的簡単に表示が実現。<br />
(SG12864では、各信号の出力タイミングの調整が必要でしたが、今回は簡単に表示が確認出来ました。)white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-12016972155565431992013-01-12T16:57:00.003+09:002013-01-15T00:23:22.064+09:00.Net (VC++) Chartクラスを使ってグラフを表示<br />
先日作成した電子温度計(Stellaris LM4F120)とPCとの連携を行いたいと思い、測定データをPCに取り込み、データのグラフ表示を試しました。<br />
以前VC++でグラフ表示を行った時 System::Drawing::Graphics等の Drawing配下のクラスを利用しましたが、今回は、Chartクラスを使ったグラフ表示を試しました。<br />
<br />
===================================================================<br />
1.概要<br />
電子温度計 [UART] ==(USB)== [COMポート] <strong>PC</strong><br />
<strong> 測定温度</strong><br />
<br />
デザイン<br />
VC++でWindowsフォームアプリケーションでプロジェクトを作成する。<br />
Form1にChart、SerialPort オブジェクトを追加 設定する。<br />
<br />
初期処理<br />
Chart/Seriseに1024個のDataPointを値0で登録する。<br />
メイン処理 <br />
シリアルポート受信イベントで電子温度計が出力する温度データを取り込む。<br />
取り込んだ温度データを順次 Chart/Serise/DataPointオブジェクトに設定する。<br />
<br />
===================================================================<br />
<a href="http://1.bp.blogspot.com/-gjJeABuFcGA/UPEPwGs_HcI/AAAAAAAABGc/BbNuJ-021eU/s1600/ThermometerChart.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="125" src="http://1.bp.blogspot.com/-gjJeABuFcGA/UPEPwGs_HcI/AAAAAAAABGc/BbNuJ-021eU/s320/ThermometerChart.jpg" width="320" /></a>2.VC++プロジェクト作成<<非時系列チャート>><br />
1)Chart設定<br />
Form1にChartオブジェクト chart1 を作成<br />
プロパティ設定 Seriseコレクション(ChartType:Line)<br />
2)SerialPort設定<br />
Form1にSerialPortオブジェクト serialPort1を作成<br />
プロパティ設定 BaudRate と PortNameを設定<br />
<br />
<br />
3)コーディング コンストラクタ Form1(void)<br />
①Charting/Seriesオブジェクト series1tをローカル宣言<br />
System::Windows::Forms::DataVisualization::Charting::Series^ series1t;<br />
②chart1のSeries1を①で宣言したseries1tに読みだす。<br />
series1t = this->chart1->Series["Series1"];<br />
③Charting/DataPointオブジェクトを初期値で作成。<br />
<br />
System::Windows:・・・:Charting::DataPoint^ tmppoint<br />
= (gcnew System::Windows::・・・::Charting::DataPoint(i,0));<br />
<br />
④Charting/DataPointオブジェクトを①で宣言したseries1tに登録する。<br />
series1t->Points->Add(tmppoint);<br />
*③④を繰り返し1024のDataPointオブジェクトをseries1t(chart1/Series1)に登録する。<br />
<br />
⑤シリアルポートをOpenする。<br />
this->serialPort1->Open();<br />
<br />
4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)<br />
①Charting/Series、Pointsオブジェクト series1t、tmppoint をローカル宣言<br />
②DateTime型で現在時刻を取得する。<br />
DateTime timesp = System::DateTime::Now;<br />
③シリアルポート受信データを取り込み、温度データを抽出する。<br />
strreceive = this->serialPort1->ReadLine(); [[strreceive:String]]<br />
strvalue = strreceive->Substring(7,6); [[strvalue:String 温度データ位置:7]]<br />
④取得した温度データでSeries1のDataPointを更新する。<br />
(インデックス指定で、一旦Series1のDataPointを削除して、取得した温度データでDataPointオブジェクトを作成し登録し直す。)<br />
series1t = this->chart1->Series["Series1"];<br />
tmppoint = series1t->Points[IntPointIndex]; [[IntPointIndex:DataPointインデックス]]<br />
series1t->Points->Remove(tmppoint);<br />
System::Windows:・・・:Charting::DataPoint^ tmppoint1 <br />
= (gcnew System::Windows::Forms::DataVisualization::Charting::DataPoint(IntPointIndex,System::Convert::ToDouble(strvalue)));<br />
series1t->Points->Insert(IntPointIndex,tmppoint1);<br />
<a href="http://4.bp.blogspot.com/-_CoWl7V6JZw/UPEPw_cyMsI/AAAAAAAABGg/2Wn-Dd1gxv8/s1600/ThermometerChart2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="170" src="http://4.bp.blogspot.com/-_CoWl7V6JZw/UPEPw_cyMsI/AAAAAAAABGg/2Wn-Dd1gxv8/s320/ThermometerChart2.jpg" width="320" /></a><br />
5)エラー対処<br />
このコーディングでプログラムを実行すると、不定期のタイミングで「InvalidOperationException ”コレクションが変更されました。実行されない可能性があります。” エラー」が発生します。<br />
①原因の予想<br />
チャート表示処理中にチャート情報の更新が重なったため起きたエラーと思われます。<br />
②対処<br />
Serise1/DataPointオブジェクトの削除、挿入処理はChartを一旦非表示にして実行する。<br />
this->chart1->Visible = false; <br />
<br />
<br />
===================================================================<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-d5RC8Opu7fY/UPEUeOP5qqI/AAAAAAAABGw/DZ7aeLlrBZE/s1600/ThermometerChart3.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="132" src="http://1.bp.blogspot.com/-d5RC8Opu7fY/UPEUeOP5qqI/AAAAAAAABGw/DZ7aeLlrBZE/s320/ThermometerChart3.jpg" width="320" /></a></div>
3.VC++プロジェクト作成 <<時系列チャート>><br />
<br />
1)Chart設定<br />
プロパティ設定 Seriseコレクション(ChartType:Line <span style="color: red;">XValueType:Time</span>)<br />
2)SerialPort設定<br />
<br />
<br />
3)コーディング コンストラクタ Form1(void)<br />
①シリアルポートをOpenする。<br />
<br />
4)コーディング シリアルポート受信イベント処理 (serialPort1_DataReceived)<br />
①Charting/Seriesオブジェクト series1tをローカル宣言<br />
②DateTime型で現在時刻を取得する。<br />
③シリアルポート受信データを取り込み、温度データを抽出する。<br />
④取得した温度データでDataPointを作成し Series1に登録する。<br />
System::Windows:・・・:Charting::DataPoint^ tmppoint2 <br />
= (gcnew System:・・・:Charting::DataPoint(timesp.ToOADate(),System::Convert::ToDouble(strvalue)));<br />
series1t->Points->Add(tmppoint2);<br />
⑤Series1に登録されたDataPointオブジェクトが1024を超えた場合。先頭のDataPointオブジェクトを削除する。<br />
series1t->Points->RemoveAt(0);<br />
<br />
===================================================================<br />
※メモ<br />
●DataPointの設定<br />
DateTime値をDataPointのX値に設定する場合 ToOADate()メソッドを使用する。<br />
●チャートデータの更新処理の工夫<br />
データDataPointコレクションの更新時 Chatオブジェクトは非表示にする。 (前述)<br />
<br />
※気になる点<br />
●MicroSoftのmsdnオンラインドキュメントの不備<br />
ChartクラスのSystem名前空間からの継承階層はSystem::Windows::Forms::DataVisualization::Charting::Chartですが、オンライドキュメントでSystem名前空間から繰るとSystem::Windows::Forms名前空間 止まりでした。また、DataVisualization名前空間配下の Series等のクラスではドキュメントの繰り方で、内容の無いページが現れます。<br />
とにかく、Chartクラスを使うのには情報が少ない。white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-33632108867577566412012-12-27T13:27:00.002+09:002012-12-27T13:27:32.354+09:00Stellaris LaunchPadで電子温度計を作ってみました。<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-fgclM6PAbjk/UNuq30lhBbI/AAAAAAAABF4/JoL16orMilQ/s1600/StellarisLaunchPad_03.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="256" src="http://3.bp.blogspot.com/-fgclM6PAbjk/UNuq30lhBbI/AAAAAAAABF4/JoL16orMilQ/s320/StellarisLaunchPad_03.jpg" width="320" /></a></div>
TI Stellaris LaunchPadに温度センサーを繋げて温度表示を行いました。<br />
最初、単にStellaris LM4F120のAIN端子に温度センサを繋げて、「はい終了!」のつもりが。。。<br />
以前 MSP430で温度計を作ったときは、電圧出力型温度センサを使ったのですが、今回はLM4F120のADCが12ビットなので、<br />
せっかくなら、「精度のある温度センサを!」<br />
せっかくなら、「複数の温度センサを!」<br />
といったことで、結構手間取るはめになりました。<br />
<br />
<br />
1.温度センサについて<br />
今回使用した温度センサはUS Sensor社のUSP11491 です。<br />
<div style="clear: both; text-align: left;">
2.Rcの選択について</div>
<div class="separator" style="clear: both; text-align: left;">
今回使用の温度センサは、計測温度の上昇に伴い、抵抗値が減少します。したがってLM4F120が出力する電圧Vccの分圧回路を組む必要があると考えました。分圧回路を構成する2つの抵抗 1つはこの温度センサ、もう1つは固定抵抗(Rc) つまりRcを決める必要があります。<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 1em; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-xjiBkmzUMIM/UNurAVeii6I/AAAAAAAABGA/ptFndCD6AZI/s1600/%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="125" src="http://2.bp.blogspot.com/-xjiBkmzUMIM/UNurAVeii6I/AAAAAAAABGA/ptFndCD6AZI/s320/%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">温度測定回路、温度計算式等</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: left;">
①各温度(-55~150℃)での温度センサの抵抗値を計算</div>
<div class="separator" style="clear: both; text-align: left;">
※ただし 温度センサの B値は (0~50℃)でこの温度範囲外はBを補正する必要がありそうですが、それこそ、精密な温度計が必要になりそうで今回は目をつぶります。</div>
<div class="separator" style="clear: both; text-align: left;">
②Rcを仮に設定して、各温度(-55~150℃)での分圧(V)を計算し、1℃あたりの分圧の変化⊿Vを把握</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
⊿Vが大きいほど測定温度の分解能が大きくなる。</div>
<div class="separator" style="clear: both; text-align: left;">
●Rc 3.3KΩ の場合 35~54℃(45℃がピーク)で⊿Vが大きくなる。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
●Rc 5KΩ の場合 20~50℃(34℃がピーク)で⊿Vが大きくなる。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
●Rc 10KΩ の場合 0~40℃(19℃がピーク)で⊿Vが大きくなる。</div>
<div class="separator" style="clear: both; text-align: left;">
※測定温度域が低い場合 Rcを大きく 高い場合 Rcを小さくすることになります。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
3.Stellaris LM4F120のADCの使い方。</div>
<div class="separator" style="clear: both; text-align: left;">
StellarisWareのサンプルプログラムを参考に温度測定回路の電圧Vを取り込み温度表示をおこないました。比較的簡単に出来ました。</div>
<div class="separator" style="clear: both; text-align: left;">
しかし、複数温度センサー構成を試みたところ、なかなか2ch以降の電圧Vの取り込みが行えませんでした、StellarisのADCのシーケンス、シーケンスステップがなかなか理解できなかったのが要因でした、ドキュメントに関連するブロック図でもあったらと思います。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
//////// 3チャネルのADC取り込み設定//////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
////////////////端子設定/////////////////////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);</div>
<div class="separator" style="clear: both; text-align: left;">
///////////////ADC0の使用宣言///////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);</div>
<div class="separator" style="clear: both; text-align: left;">
///////////////シーケンス設定///////////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_PROCESSOR, 0);</div>
<div class="separator" style="clear: both; text-align: left;">
//////////////ステップ設定////////////////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 |ADC_CTL_IE );</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 1, ADC_CTL_CH1 |ADC_CTL_IE );</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 2, ADC_CTL_CH2 |ADC_CTL_IE |ADC_CTL_END);</div>
<div class="separator" style="clear: both; text-align: left;">
//////////////シーケンス稼働////////////////////////////////////////////////////////////////<br /> ROM_ADCSequenceEnable(ADC0_BASE, 2);<br /> ROM_ADCIntClear(ADC0_BASE, 2);<br /> </div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
//////// 3チャネルのADC 取り込み //////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
///////////////ADCトリガ////////////////////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCProcessorTrigger(ADC0_BASE, 2);<br />///////////////ADCコンバージョン完了待ち////////////////////////////////////////////////////////////////////</div>
<div class="separator" style="clear: both; text-align: left;">
while(!ROM_ADCIntStatus(ADC0_BASE, 2, false))<br /> {<br /> }</div>
<div class="separator" style="clear: both; text-align: left;">
ROM_ADCIntClear(ADC0_BASE,2);<br /> ///////////////ADCデータ取得////////////////////////////////////////////////////////////////////<br /> ROM_ADCSequenceDataGet(ADC0_BASE, 2, ulADC0_Value);</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
ulADC0_Valueは配列 ulADC0_Value[0]がCh0 ulADC0_Value[1]がCh1 ulADC0_Value[2]がCh2 の値を格納</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
</div>
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0tag:blogger.com,1999:blog-450116424462875091.post-45465924934562883172012-12-27T00:41:00.000+09:002012-12-27T00:41:29.888+09:00Stellaris LaunchPadを試してみました。<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-lBvihLP3i_4/UNrXMTXGn2I/AAAAAAAABFk/79YLy5ML65A/s1600/StellarisLaunchPad_01.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="278" src="http://4.bp.blogspot.com/-lBvihLP3i_4/UNrXMTXGn2I/AAAAAAAABFk/79YLy5ML65A/s320/StellarisLaunchPad_01.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SG12864によるアルファベット&テストパターン表示</td></tr>
</tbody></table>
2月前に購入した TI Stellaris LaunchPad をいじり始めました。<br />
<br />
<br />
開発環境の Code Composer Studio v5 はライセンス切れで、GNU GCCでのプログラミングを試しました。<br />
<br />
他のマイコンとは異なり、Stellarisでは、レジストリを直接操作するようなプログラミングはせず、レジストリの操作を遮蔽した各種関数を使用たプログラミングとなりました。<br />
<br />
<br />
<br />
<br />
<br />
1.デバイスドライバ―のインストール<br />
TIのHPから、ICDIドライバー(spmc016.zip)をダウンロードし、以下のドライバーをインストールしました。<br />
・Stellaris ICDI JTAG/SWD Interface<br />
・Stellaris ICDI DFU Device<br />
・Stellaris Virtual Serial Port<br />
<br />
2.LM フラッシュ・プログラマ のインストール<br />
・ダウンロードファイル:LMFlashProgrammer_1470.zip<br />
<br />
3.StellarisWare のインストール<br />
StellarisのドキュメントをTIのサイト探すのですが、プログラミングガイド、レジストリのリファレンスマニュアル等が見つからず、使えそうなドキュメントは各種関数のユーザーガイド(LM4F120H5QR_ROM_UserGuid.pdf)ぐらいで、プログラム開発は困難と思われました。<br />
StellarisWareには、LM3S,LM4Fシリーズのサンプルコードが含まれこれが開発の糸口になります。<br />
<br />
*TIからStellarisWareのファイルを ダウンロードすると、ダウンロード元でSW-LM3S-9453.exe(129MB) と SW-LM3S-9453(356M)の2つの異なったファイルが得られます。<br />
SW-LM3S-9453.exeを実行するとインストールエラーになり、そこで強引にSW-LM3S-9453のファイル名をSW-LM3S-9453.exeに変更してインストールを実行しました。<br />
<br />
<br />
4.GNU GCC<br />
GCCはすでにインストール済み(Interface誌 付属FM3基板 Cortex-M3 用)<br />
StellarisWareのサンプルコードのディレクトリで make は成功しました。<br />
<br />
※Stellaris LaunchPadの価格が1259円(DigiKey)に改定されていました。しかも在庫0 もう少し多めに買っとけば良かったかなと。。。。<br />
<br />
white cloudshttp://www.blogger.com/profile/11715933744125663886noreply@blogger.com0