マイコンプラス

    二足歩行ロボットの制御やセンサの使い方、ロボットキット、ロボットの大会などについて紹介します

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。
    [ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

    [C++]CSVファイルの読み込み

     CSVファイルを読み込んで,カンマを除いたデータを配列に書き込むプログラムです.
     Split(string &src, string key)でカンマの読み飛ばし,readCSV(string filename, int* p)でファイルのOpenと文字列データの数値への変換,配列への書き込みを行います.

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <vector>

    using namespace std;

    vector<string> Split(string &src, string key);
    bool readCSV(string filename, int* p);

    int main(void){
    int data[256];//ファイルから読み込んだ数値を入れる配列

    readCSV("data.csv", data);//ファイルから読み込み

    //最初の10個を表示させてみる
    for(int i = 0; i < 10; ++i) {
    cout << data[i] << endl;
    }
    }

    bool readCSV(string filename, int* p) {
    fstream file;
    string str;

    file.open(filename.c_str(), ios::in);
    if(! file.is_open()) {
    return false;
    }

    while(getline(file, str)) {
    vector<string> str_line = Split(str, (string)",");
    int size = str_line.size();

    for(int i = 0; i < size; ++i) {
    stringstream sstr;
    sstr << str_line[i];
    sstr >> p[i];
    }
    p += size;
    }
    file.close();
    return true;
    }

    vector<string> Split(string &src, string key) {

    string str = src;
    vector<string> str_line;
    int str_len = str.length();
    int key_len = key.length();

    int index = 0;
    while(index < str_len) {
    int oldindex = index;
    index = str.find(key, index);
    index = (index == string::npos ? str_len : index);
    string tmp = str.substr(oldindex, index - oldindex);
    str_line.push_back(tmp);
    index += key_len;
    }
    return str_line;
    }

    スポンサーサイト
    [ 2012/11/30 02:15 ] C言語 | TB(0) | CM(0)

    [C++]1次元配列を3次元配列に整形する

     外部RAMなんかに書き込んでおいたデータを扱いやすくするために3次元配列の形にしたいことがありました.案外てこずったのでメモしておきます.
     3次元として持つための領域を動的に確保しているのでサイズが可変です.


    #include <iostream>
    using namespace std;

    int data[256]; //元となるデータ領域

    int main()
    {
    //データ領域への値の代入
    for(int i = 0; i < 256; ++i) {
    data[i] = i;
    }

    //3次元配列の大きさ
    char size_z = 3;
    char size_y = 4;
    char size_x = 5;

    //とりあえずポインタに元のデータ領域の先頭アドレスを代入
    int* p = data;

    //3次元配列arrayへの整形
    int*** array = new int**[size_z];
    for (int i = 0; i < size_z; ++i) {
    array[i] = new int*[size_y];
    for (int j = 0; j < size_y; ++j) {
    array[i][j] = p + size_x * j;
    }
    p += size_x * size_y;
    }

    //確認のため表示
    for (int i = 0; i < size_z; ++i) {
    for (int j = 0; j < size_y; ++j) {
    for (int k = 0; k < size_x; ++k) {
    cout << array[i][j][k] << endl;
    }
    }
    }

    //メモリの解放
        for (int i = 0; i < size_z; i++) {
    delete[] array[i];
    }
    delete[] array;

    }



    (sizeof int) * (1 + size_z)だけのメモリを消費します.
    [ 2012/11/16 01:15 ] C言語 | TB(0) | CM(0)

    中華CNC CNC3020導入記 設定編

    前回:中華CNC CNC3020導入記 購入編
     組み立て終わったので,動かしてみたいと思います.

    まず基板を見てみる


     とりあえず,一度見てみないと心配なので,コントロールBOXを開けてみました.

    sIMAG0151.jpg
     大きなトランスと,電源基板,ステッピングモータ制御基板が入ってました.

    sIMAG0152.jpg
     モータドライバは東芝 TB6560AHQでした.アルミの放熱板に固定されています.
     基板をよく見ると,

      LIMIT X Y Z
      GND PWM VCC
      PROBE


    などと書かれているピンがありました.リミットスイッチや,スピンドルの回転数の操作,切削Z軸センサの追加が可能なのかもしれません.

     コントロールBOX内で見つけた不具合なんですが,EMERGENCY STOPのスイッチに繋がる配線が抜けていたのでESTOPと書いてあるピンに差し直しました.
     それ以外はハンダ付けもきれいですし,問題ないようです.

    パラレルポートの増設


     コントロールボードはPCのD-sub25pinのパラレルポートに繋がなければなりません.しかし,そんなもの手持ちのPCに付いてないので,PCI Express接続のパラレルポート変換基板を用いました.
     変換基板はこれに似たものをヤフオクで買いました.「PCI-Express パラレル」とヤフオクで検索して出品されていればそれですhttp://auctions.search.yahoo.co.jp/search?p=PCIExpress+%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB&auccat=&aq=-1&oq=&ei=UTF-8&tab_ex=commerce&slider=0.Ubuntuの入ったPCで使うので,Linux対応と書いてあるのがポイントでした.

    OSについて


     CNC制御用のPCのOSにはUbuntu10.04を使います.
     この理由なんですが,
    ・手持ちのPCでPCIExpressポートが空いてるのがたまたまUbuntuの入ってるPCだった.
    ・Windowsで使えるCNC制御ソフトのMach3は32bitOSでないと使えなくて,しかもXP推奨だが,手持ちのWindowsは64bit版のWindows7しかない→Linuxしかない
    ・せっかく激安CNCなんだからフリーのソフトにこだわりたい.
    ・Ubuntuで使えるCNC制御ソフトのLinuxCNCがUbuntu10.04じゃないとだめだった.
    という感じです.
     Ubuntu10.04をインストールしていなければ,ここから日本語Remix版のISOを入手して,インストールしてください.
     さて,UbuntuをインストールしたPCの,PCI(Express)スロットに変換ボードを挿したら,端末より

    $ lspci -v


    と入力してパラレルポートのアドレスを調べます.私の場合は1000と1008の二つ出てきたんですが,どちらが使えるのかやってみないとわかりません.
     後で使うのでアドレスをメモしておきます.

    LinuxCNCのインストール


     LinuxCNCをlinuxcnc.org/からダウンロードします.
    HOME>Download>Other Installation Options と進んでいって,
    If you prefer to start with the distributed Ubuntu CD, you can install LinuxCNC yourself with these instructions:
    と書いてあるところから,「lucid-install」をクリックしてダウンロードします.lucidというのはUbuntu10.04の別名です.
     保存フォルダに移動して端末より以下のように入力してインストールします.

    $ chmod a+x linuxcnc-install.sh
    $ sudo ./linuxcnc-install.sh



     最終確認に「はい」と答えるとインストールされ,再起動すれば「アプリケーション」メニューに「CNC」が追加されているはずです.

    ブートローダの設定


     LinuxCNCをインストールし,再起動すると,リアルタイムカーネルも追加されます.OS起動時にこのRTカーネルを選択しないと,LinuxCNCは動作しません(エラーダイアログが出ます).
     起動時のカーネルの設定のため,まず,StartUp-Managerで設定します.StartUp-Managerはシステム>システム管理>Synapticパッケージマネージャーからインストールできます.インストールしたら,システム>システム管理>StartUp-Managerを立ち上げ,カーネル選択の待ち時間と,デフォルトのカーネルを設定します.
     次に端末で

    $ sudo gedit ../../etc/default/grub


    と入力し,ブートローダーの設定ファイルに変更を加えます.変更は
    GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true

    と書いてあるところを,
    #GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=false

    に修正します.
     以上の設定を終え,OSを再起動すると,カーネル選択画面が出てくるようになります.kernel 2.6.31-11-rtaiを選択してOSを起動します.

    続き:中華CNC CNC3020導入記 設定編2
    [ 2012/11/14 02:14 ] CNC | TB(1) | CM(2)


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。