2017年11月14日火曜日

ROSとPSoC5LPでUSBUART通信(PSoC編)

前回の投稿からどれだけだったんでしょうね…(^_^;)
第30回ロボットコンテストから早1ヶ月が経とうとしています。
あまり良い成果を残せずに終わってしまった大会でしたが、今回のロボコンを経て学んだことをすこし備忘録として残そうかと思いました。
そしてこれを来年にも活かせるようにしなければな…と思っているわけです。ハイ。
というわけでブログタイトルのようにやって行きたいと思います。
ではでは…
環境
PSoC Creator 4.1
PSoC 5LP Development Kit
ぐらいでいいですかね?(もちろんPrototyping Kitでもできますよ~)

とりあえずぱぱっとUSBUARTのスケッチとコードを貼り付けときます。
(正直USBUARTではわかってないまま使ってる部分が...(;´∀`))

#include<project.h>
#include<stdio.h>


int main()
{
       CyGlobalIntEnable; /* Enable global interrupts. */

      LCD_Char_Start();

      USBUART_Start(0,USBUART_5V_OPERATION);
      while(!USBUART_bGetConfiguration()){}
      USBUART_CDC_Init();

      int count = 0;
      uint8 buff[64] = "";


      while(1)//main loop
      {   

            if(0 != USBUART_GetConfiguration())
            {

                  if(0 != USBUART_DataIsReady())
                  {
                        count = USBUART_GetAll(buff);
                        if( count != 0){

                        while(0 == USBUART_CDCIsReady()){}

                        USBUART_PutChar(buff[0]);

                        LCD_Char_Position(0,0);
                        LCD_Char_PrintNumber(count);
                        LCD_Char_PrintString(buff);

                        if(64 == count){
                              while(0 == USBUART_CDCIsReady()){}
                              //sent zero packet
                              USBUART_PutData(NULL,0);
                        }      
                  }
            }     
       }
}    
}



配線図は以下の通りです。
超シンプル(*´∀`)


この記事と連携させればこぉんな感じで通信できるはずです...





...次の更新はいつになることやら(;´∀`)

2017年11月12日日曜日

ROSとPSoC5LPでUSBUART通信(ROS編)

今回はROS編です。はい。
とりあえず、環境のほうをざっくり書いときます。
環境
MacBook Air (11-inch, Mid 2011)
・プロセッサ  1.6 GHz Intel Core i5(多分3世代?)
・メモリ    4 GB 1333 MHz DDR3
・グラフィック Intel HD Graphics 3000 384 MB
・シリアル番号…っと危ない危ない(;´∀`)

macos Sierra 10.12.5(16F73)とUbuntu 16.04.2を
デュアルブートさせてます。

Ubuntu 16.04ということでROS界でのLTS版とされる
Kinetic KAMEを使用しています。

まずディレクトリ構造から
※いじる必要のないフォルダ、ファイルは非表示にしています。

├── catkin-ws
│   ├── build
│   ├── devel  
│   └── src
│       ├── CMakeLists.txt
│       ├── USBUART_comm
│       │   ├── CMakeLists.txt
│       │   ├── include
│       │   │   └── USBUART_comm
│       │   ├── package.xml
│       │   └── src
│       │       └── USBUART_comm.cpp
│       └── 
└──       

下はUSBUART_comm.cppのソースです。

#include <ros/ros.h>
#include <string>

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

int str_counter (char *str){
  int counter = 0;
  while(*str++){
    counter++;
  }

  return counter;
}

int main(int argc, char **argv){
  std::string dev = "/dev/ttyACM0",str_str;
  int baudrate = B9600;

  char str[64] = "Hello ROS & PSoC";

  ros::init(argc, argv, "UART_comm");

  ros::NodeHandle arg_nh("~");
  ros::NodeHandle nh;

  arg_nh.getParam("device", dev);
  arg_nh.getParam("baudrate", baudrate);
  arg_nh.getParam("message",str_str);

  strcpy(str,str_str.c_str());

//-------シリアルポート設定-------------------------
      int fd;                           /* ファイルディスクリプタ */
      struct termios oldtio, newtio;    /* シリアル通信設定 */
      int baudRate = B57600;
      fd = open(dev.c_str(), O_RDWR);   /* デバイスをオープンする */

      ioctl(fd, TCGETS, &oldtio);       /* 現在のシリアルポートの設定を待避させる */
      newtio = oldtio;                  /* ポートの設定をコピー */
      newtio.c_cflag = baudRate | CS8 | CREAD;
  	  newtio.c_iflag = IGNPAR | ICRNL;
  	  newtio.c_oflag = 0;
  	  newtio.c_lflag = 0;          /* ポートの設定をおこなう 詳細はtermios参照 */
      ioctl(fd, TCSETS, &newtio);       /* ポートの設定を有効にする */
//--------------------------------------------------------

  while(ros::ok()){

    printf("%s\n%d\n",str, str_counter(str));

    if(str_counter(str)>64){
      ROS_INFO("Warning!! \nThe amount of data that PSoC5 can receive is up to 64bytes.");
      //PSoC5のUSBUARTは一度に最大64バイトまでしか受け付けない。
    }

    if(fd<0){
      ROS_INFO("Error ! serialport open error!");
      return -1;
    }



    write(fd,str,sizeof(str)); //送信

    ros::spinOnce();

  }
  ioctl(fd, TCSETS, &oldtio);       /* ポートの設定を元に戻す */
  close(fd);                        /* デバイスのクローズ */

  return 0;
}
下はUSBUART_commフォルダー内のCMakeLists.txtです。
cmake_minimum_required(VERSION 2.8.3)
project(USBUART_comm)

add_compile_options(-std=c++11)


find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)


catkin_package(
 INCLUDE_DIRS include
 LIBRARIES USBUART_comm
 CATKIN_DEPENDS roscpp std_msgs
 DEPENDS system_lib
)


include_directories(
include
  ${catkin_INCLUDE_DIRS}
)


add_executable(${PROJECT_NAME}_node src/USBUART_comm.cpp)


add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})


target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)
あとは記述する必要はなさそうですが、 一応USBUART_commフォルダー内のpackage.xmlも晒しときます。
<?xml version="1.0"?>
<package>
  <name>USBUART_comm</name>
  <version>0.0.0</version>
  <description>The USBUART_comm package</description>

  <maintainer email="yukimakura@todo.todo">yukimakura</maintainer>


  <license>TODO</license>


  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>


  <export>


  </export>
</package>

ソースコードを見たら一目瞭然ですが、 ROSのソースにそのままlinuxのシリアル通信のソース乗っけただけという簡単なものです。 ですが、応用すれば別ノードやサービスから購読したデータをPSoCや別のシリアル通信できる マイコンと通信することができます...
えぇ、そうですとも。



絶対同等以上のことできるパッケージってもう存在してますよね!?

というわけでもし誰かご存知でしたら
教えてくださるとすごくありがたいです...m(_ _)m
あと素人ながら書かせて頂いたのでぜひご指摘等ございましたらビシバシ叩いていただくと光栄です。
参考にさせていただいたサイト様
FAQ : シリアル通信をおこなうプログラムを作成するには?
https://armadillo.atmark-techno.com/faq/serial-programming


2017年3月20日月曜日

PSoC CreatorでPWMサーボを制御(2017東海北陸ミニロボ)



2017/03/19から2日間に渡って
ロボコンの東海北陸地域の高専の交流会がありました。

今回の交流会は第二回ということでまだまだ歴史の浅い交流会
でしたが、私は今回が初参加ということで
正直あんまり期待していませんでしたが、
思いの外皆さんのプレゼンが面白くて、
そして私も良い刺激を受けることができました。
この場を借りて幹事の方々、イベント関係者様に感謝申し上げますm(_ _)m

さて、二日目の展示で釣れるかわからないですが、
富山射水のテーブルでPSoC5LPで書いた
PWMサーボのソースを公開しておりました。

みなさんのお話を聞いてると、存在は知っているが
ほとんど使ってないという方が結構おられて
正直知ってる人が割りといて驚きました(笑)

きっと皆さんがPSoCに手を出してない大きな理由として
情報が少ないというのがあると思います。
私も最初はそれに手こずりましたが、
基礎的な部分の壁を超えると、応用の方は
結構ググれば情報が出てきました。

なのでそこはなんとか気合でがんばって乗り切りましょう
(;´∀`)

PSoCは昔の開発環境としてPSoCDesignerと言うものがありましたが、
2010年頃にCypressはPSoC Creatorという全くあたらしい
開発環境を発表すると同時に後発のPSoCもPSoCCreatorに対応したものとなりました。

まあ、それはいいのですが、PWMのサーボの情報が
昔のPSoCDesignerの方のものしか無い!!
という状況に陥り、悩んだという事態に陥りました。
ですが、なんとかPSoCCreatorにてPWMサーボを扱えたので
備忘録として残しておこうと思います。

とりあえずC++にしてますが、
もしCのほうがいいという方がおられたら、
コメントいただけるとなんとかCのもあげます。
なお、修正点や改善点等ございましたら、
ぜひコメントいただけるとすごくうれしいです。

環境はPSoCCreator4.0
PSoC5LP prototyping kit
ifdef __cplusplus
extern "C" {
#endif
#include <project.h>
#ifdef __cplusplus
}
#endif


class CompareConverter{
    public:
        int us2compare(int servonum){

            if(635>servonum){
                return 316;
            }
            if(2350<servonum){
                return 1175;
            }
            return 315+((servonum-635)/2);
            
        }
        int degree2compare(int Servonum){
        
            float servonum = (float)Servonum;
           
            if(0>servonum){
                return 316;
            }
            if(180<servonum){
                return 1175;
            }
            return 315+((servonum)*4.77);
        }
};



int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    CompareConverter compconv;
    
    //通電確認用
    power_Write(1);

    for(;;)
    {
        PWM_1_WriteCompare(compconv.degree2compare(90));
       
     
    }
}


ピン配置、PGAの配置等


PWM自体の設定


電源はPSoCのVCCとGNDで
PWMの信号は1_6ピンに刺すと
サーボモータが90度を指すところに回転する...はず(笑)
只今帰宅途中のバスで書いてるので実際試してないです(おい

ちなみに2_1のピンに設定してあるpowerってのは
ただのPSoC通電確認用です。

2017年1月19日木曜日

GTX980mを無理矢理にVRReadyに引き上げてみた(ベンチマーク編)

前回の投稿でGPUの限界を開放したわけなので
せっかくですからベンチマークをしてみました~ \(*´∀`)/ワーイ

使用したソフトは言わずもがな知れた
SteamのSteamVR Perfomance Testです。

ではデフォ(OCなし)の状態でレッツゴー



Oh...惜しい!
あとちょっとでVRReadyなのに...
まぁ、ぶっちゃけ全然VRできるスペックなんですけどね(^_^;)

ではOCを早速やってみましょう!!
私はOCにNVIDIA Inspectorを使用しております。

ではコアの電力を30mVほど上げまして
GPUは240MHzほどOCと。

その結果は...


ドコドコドコドコドコドコドコドコドコドコドコドコ...









VRReadyキタ━━━━(゚∀゚)━━━━!!

とまぁ...ギリギリ到達と。

このパソコンは重量を引き換えに冷却性能だけはいいので
75℃にも達していないようですね。
(ファンは手動で全開の状態でベンチを回しました)

この際もっと限界を....

ということでめざせ1.4GHz動作を目標にやってみました。


こちらが結果です。

なんとか完走しました。
ですが、しばらくするとwindowsが応答なくしました(っておい

で、どうやらいろいろ調査してみると意外な原因が...

これ以上OCする場合には330W電源が必要

...トホホ

こいつのデフォは230Wの電源なのですが、さすがclevo!グローバルに展開しているだけあって、
330Wのアダプターもあるのです。
GPUをOCするとどうやら230Wじゃぁ足りなくなってくる模様...

怖い、怖すぎるぜOC!

そんな感じで電源アダプターやGPUが死んだ場合は一応
Eurocomの方で購入できますので(安いとは言ってない

あともはや常套句ですが、一応...

完全に自己責任でお願いします。
もし失敗してGPUがお釈迦になっても
私、ゆきまくらは一切責任を負いません。




ではみなさま、楽しいノートPCOCライフを!(*^^*)ノシ



iiyama(G-Tuneも可)のGPU(Maxwell)の限界突破してみた(実践編)

眠い中こんばんわ?
いや、おはようかな??(^_^;)

では、実際にGPUにvBIOSを書き込んで行きましょう!
前回の記事で行ったようにshift+右クリックで例の5つのファイルがある
ディレクトリをコマンドプロンプトで開いてくださいまし

そしたら画像のように

nvflash.exe -r

と入力します。



これはGPUのvBIOSの書き換えロックを解除する行為のようです。

成功したならば次はいよいよBIOSの書き換え作業となります。

当方の環境の場合は

nvflash.exe 98MPMOC.rom

になっていますが、
98MPMOC.rom
の部分は自分のPCにあったromファイルにしてください。

確認されますのでそこで"y"を入力してください。

画面チカチカであたかも不安をあおるような感じになりますが
基本放置で完了です。



こんな感じで淡々と記事にしてますが、
実際にこれやってるときには
手に変な汗かきながらやりました(^_^;)

失敗したら割りと辛い現実が待ち受けておりますので...
((((;゚Д゚))))ガクガクブルブル

こういうことをやろうとする人には
言わずもがな知れたことだとは思いますが一応ね。

完全に自己責任でお願いします。
もし失敗してGPUがお釈迦になっても
私、ゆきまくらは一切責任を負いません。




まぁ、次回はいい夢その一のベンチマーク編ですかね。
乞うご期待?

2017年1月17日火曜日

iiyama(G-Tuneも可)のGPU(Maxwell)の限界突破してみた(準備編)

今年初の記事となりました。
今年は長い長~い初夢を見ました(*^^*)
個人的には最終的には割りと満足な夢になったのですが、
見ている最中は悪夢でしたね(笑)
ということで...

今回はシリーズものでございます!!

まぁ、第一弾ということで...
手始めに

GTX980MのVBIOSをMODBIOSに書き換えたお話

とかどうでしょう(^_^;)
解説の前に当方の環境の確認
  • iiyama(パソコン工房)のゲーミング
  • clevoの型番でいえばP750ZMです。
  • Core i5 4590
  • GTX 980M...
こんなもんでどうでしょうか?
多分Gtuneの方にも同じ型のやつがあると思います。
なにせ私がこいつを買ったときは
パソコン工房の蔵出しセールで13万ほどで購入したもの
なのでiiyamaでの扱いがよくわからんのです(´・ω・`)
まぁ、clevoの型さえわかればこっちのものですね~
(*´・ω・)(・ω・`*)ネー

秋葉原とかそこらで行ったりすると変な脳汁が
分泌されるような方々にはきっと
OC(オーバークロック)の限界を確かめたくなるような性があると思うのです。

今回は準備編と言うことで...

ちなみに、こいつのデフォvBIOSでのOCの限界が
+135MHzですね。


では、素材集めです(マッテマシター

Premamod(音量注意(笑))
そしたら、自分のPCにあうGPUをchoice!
当方のPCはGTX980Mの8GBでした。
必死にぐぐるか
GPU-Zでも使ってくださいまし~

いちおうBIOSを書き換えるのでちゃんとダウンロードできてるか、
ハッシュ値をちゃんと確認しましょう。
ダウンロードしたファイル(zipのまま)があるディレクトリ
をシフトキーを押しながら右クリックして、
コマンドウィンドウでここを開く(W)をクリック!

そしたらコマンドプロンプトが出てくるので
''certutil -hashfile ダウンロードしたコンテンツの名前 MD5''
を入力します。

それで公式サイトのMD5の値と同じだったらOKです。
では解凍...(展開ともいうけど
どうでもいいですけど私は解凍派です( ー`дー´)キリッ
そしたら私のほうではGTX980Mというフォルダーが出てきました。
そんな感じでディレクトリを辿っていくと...
  • 98MPMOC.rom
  • ModMe.bat
  • ModMe2.bat
  • nvflash.exe
  • nvflsh64.sys
という5つのファイルが出てきました。
基本下の4つは変わらないはず。
それが確認できたところで今回は筆を休ませて頂きます。
てかネムイ(´・ωゞ)
ではでは(´・ω・`)ノシ