月: 2021年4月

  • PythonでArduinoを制御したいのだ!

    PythonでArduinoを制御したいのだ!

    ArduinoはArduino言語によって制御します。
    ただ、もっと複雑な処理をしたい、何かのプログラムと一緒にArduinoを制御したいという時が訪れることでしょう。

    今回紹介するpySerialというモジュールはRaspberry PiやArduinoとシリアル通信を行うことができます。
    シリアル通信をすることによって、pythonのプログラムからArduinoやRaspberry Piに指令を出し、pythonプログラムを通して制御することができます。

    今回はその基本的なプログラム紹介します。
    これが使えるだけで、プログラムでできることの幅がかなり広がるでしょう。

    インストール方法

    pip install pyserial

    ターミナルやコマンドプロントでpythonを開き、インストールできます。
    もしくは、PyCharmなどのターミナルでインストールもできます。

    プログラム例

    今回は1秒ずつLEDをつけたり消したりするプログラムです。
    もともとArduinoについているLEDの13ピンに出力して検証したいと思います。
    Pythonのプログラムでは

    import serial, time
    
    def main():
        #  COMポートを開く
        print("Open Port")
        ser = serial.Serial("COM3", 9600)
        while True:
            #  LED点灯
            ser.write(b"1")
            time.sleep(1)
            #  LED消灯
            ser.write(b"0")
            time.sleep(1)
    
        print("Close Port")
        ser.close()
    
    if __name__ == '__main__':
        main()

    serial.Serialでポートと、シリアル通信の設定を行います。
    Arduino UNOでは9600を指定します。
    これはボードによって異なるので、Arduino IDEで確認しましょう。

    b”1″のbは非常に重要な役割を担っています。
    serial.write()関数では、シリアル通信をするためにはbyte列にして数字や文字列を送信しなければなりません。
    このようにして、byte列であることを示す必要性があります。

    このプログラムは無限ループなので、1秒ごとのLEDのオンオフがプログラムを止めるまで続きます。

    次にArduino側のプログラムです。

    void setup() {
      Serial.begin(9600);
      pinMode(13, OUTPUT);
      digitalWrite(13, LOW);  //  初期化
    }
    
    void loop() {
      byte var;
      var = Serial.read();
      switch(var){
        case '0':
          digitalWrite(13, LOW);
          break;
        case '1':
          digitalWrite(13, HIGH);
          break;
        default:
          break;
      }
    }

    ここではswitch case構文を使っています。
    このほうがプログラムがわかりやすいです。
    詳しくは前回のブログを見てみてください。

    ここでは0が送信されるとLOW、1が送信されるとHIGHとなります。
    このプログラムをベースに使うことによって、色々なパターンでArduinoをPythonプログラムで制御することができます。

  • Arduino言語におけるswitch case 構文

    Arduino言語におけるswitch case 構文

    Arduinoにおいて、さまざまな条件分けをしたいとき、if文で構成することがほとんどだと思います。
    しかし、条件分岐が10とか20とか(あんまりないとは思いますが)あった時はどうしましょう。

    C/C++言語にはswitch文があり、C/C++言語をベースとしているArduino言語も同じ構文が使えます。

    以下にプログラム例を記載します。

    switch (var) {
      case 1:
        // varが1のときに実行する処理
        break;
      case 2:
        // varが1のときに実行する処理
        break;
      default: 
        // どのcaseラベルにも一致しないときに実行する処理
        // defaultは、省略可能
      }

    varが変数であり、varが1の時、case 1の処理が実行されます。
    varが2の時、case 2の処理が実行されます。
    varが1, 2以外の時は、defaultの処理が実行されます。

    case 1, case 2の処理後の “break;”はそれぞれのcaseの処理が終了したということを示す文です。
    この文がないと、エラーを起こしたりします。

    defaultの処理において、break; が必要ないのは、defaultは最後の条件分岐になり、最後の処理というのが明白なためです。
    ただ、書いてはいけないわけではなく、書いても問題なくプログラムは動きます。

    また、default: 自体も省略することができます。
    if else構文のelseの省略のような感覚です。

    個人的にはswitch case構文はif構文よりもプログラムを見たときのスッキリさはあると思います。
    そこまで難しいコードでもないので、ぜひ使ってみてください。

  • 聞かされる発表から聞かれる発表へ!

    聞かされる発表から聞かれる発表へ!

    大学生活において避けては通れないもの、その一つが発表です。
    授業だけでなく、研究室、ゼミ、サークル活動などでも人の前に立ち、発表する機会は多くあります。

    小学校から高校までは授業を受けるだけであり、長い時間の発表というのはなかなか行う機会が少なかったのに、
    急に大学に入ると人前に立たされることが多くあります。

    ただ、周りの人たちの中には発表が苦手であったり、嫌いだったりする人が多くいるのも事実であり、
    発表自体も発表が下手だなー、退屈なだーと感じてしまう人は残念ながら多くいます。

    そこで、大学生活で培った発表のノウハウをどんどん載せていきます。

    今回は発表を行う上での心の部分です。

    発表が下手な人たちの典型例として、聞かされる発表を行なっているということです。
    例として、
    ・一枚のスライドの説明時間が長い
    ・発表に空白の時間がある
    ・スライド枚数が多い
    ・話の繋がりがわからない
    などです。

    基本的に発表を聞く人たちは、発表を聞きたいという意欲はほとんどないと思った方がいいです。
    誰もあなたの発表に最初から興味を持っている人はいないのです。

    発表を聞く人たちの気持ちは、中学校で30分ぐらいの校長先生の話を体育館で聞いている気分です。
    学生時代に校長先生の話を毎度興味津々で聞いていた人は少ないでしょう。

    このような聞きたいという意欲のない聴衆に対して、自分本位の発表をすることによって、自分自身は満足するかもしれませんが、聴衆は退屈します。

    人によっては、聴衆が楽しそうでない、スマホを触っている、寝ているなどの様子を見て、自分の発表はだめなんだと自己嫌悪に陥る人もいるでしょう。

    そのようにならないために、聞かれる発表をする必要があります。

    聞かれる発表には小手先の発表の技術も大切であるが、もっとも重要なのは自分自身の発表に対する考え方である。
    その考え方が変われば、聴衆を意識した発表になるでしょう。

    聞かれる発表のために重要なことは、
    ・発表で最も伝えたいことは何かをはっきりする
    ・発表はシンプルに、最小限に
    ・自分がわかりにくい、気になると感じるところはなくす
    です。

    発表で10あったとする。
    10を同じテンションで話すと聴衆にも全く何も残らないが、1つだけを重要そうに話すと、その他の部分は全くゼロかもしれないが、その1だけは少なからず頭に残るだろうと思います。

    話したい内容を絞り、短く端的に、そしてわかりやすく

    意見を押し付けるような発表ではなく、自然と聞いてもらえるような発表というのを目指す。
    それを意識していれば、自然と発表はよくなっていくと思います。

    発表がうまいなという人がいれば、その人たちに色々きいてみましょう、
    そういう人がいなければ、発表のお手本としてよく取り上げられる、スティーブ・ジョブズ、オバマ大統領などの発表を見てみましょう。
    彼らの発表は言葉だけで、多くの人に伝えることができます。
    それは、技術もすごいが、最も、自分の伝えたいことがはっきりしているという点があると思います。

  • Image J (Fiji) による連続画像処理

    生物学の研究において、抗体染色などのサンプルを共焦点レーザー顕微鏡で撮影することが多くあるかと思います。

    その撮影したデータをImage Jによってスタック画像(Stack)にしたり、波長の違う画像をマージ画像(Marge)としたりする方法を説明します。
    最後にスケールバーの挿入方法をやって終わりです。

    まず、共焦点レーザー顕微鏡では違う波長(レーザーが違う)で撮影した画像が一つのスライスごとにあり、そのスライスがz軸方向にサンプルの厚さ分だけあります。

    この時に、波長の違う同じzの位置の画像を合わせることをここではマージといい、z軸方向の画像を重ね合わせることをスタックと言います。
    Image Jでも同じ意味で使われているので、今何をしたいのがを考えながらやりましょう。

    今回Fijiで説明しますが、Image Jでも大体は同じです。
    ただ、Fijiでは共焦点レーザー顕微鏡の画像データを形式を変えることなく開くことができるため、今回はFIjiで説明します。

    今回はflylightのハエの共焦点レーザー顕微鏡画像を用いました。
    例として使う画像

    このサイトからダウンロードできるように、共焦点レーザー顕微鏡画像の画像は *.lsm など各メーカーの独自のフォーマットを用いており、このファイルの中にさまざまな情報が入っています。
    これによってスケールの情報も入っているので、自分で顕微鏡のスケールを検索しなくても正確なスケールバーを入れることができます。

    まず、Fijiを開き、出てきたメニューバーみたいなところに撮影したデータを入れます。

    開くと、何かしら黒かったり、緑かったりする新しいウィンドウが開きます。
    これが現在の作業している画面です。
    下のスクロールを動かすことによって、Z軸を動かすことができます。

    上部の Image<Color<Make Composite より画像をマージします。
    Image<Color<Channnels Tool より、チャンネルツールを開きます。

    このチャンネルツールでは、Channnelのチェックによって、そのチャンネルの表示を切り替えることができます。

    画像をスタックする時には、Image<Stacks<Z projectをクリックすると、画像がスタックされます。
    この時に、特にこだわりがない場合にはProjection TypeはSum Slicesにしましょう。
    すると、新しいウィンドウが開き、スタックされた画像が表示されます。

    ここでもチャンネルツールは使うことができ、各画像のスタック画像を見ることができます。

    スケールバーはAnalyze<Tools<Scale Barより追加することができます。
    Width in 〇〇:の値を変えることで、好きな長さにすることができます。

    処理した画像を保存する時には、File<Save asでファイルの形式を指定して保存します。
    Tiffでは何故か画像が白くなるので、PNGやjpegをお勧めします。

    最後に完成した画像がこちら

    Fijiのリンクはこちらから