H a r d w a r e

概要

我々が行っている研究はAIによって有用と推測されるアミノ酸配列を多数生成し、それらをアッセイすることで本システムの有用性を示していくというものである。これらの作業をすべて人力で行うには多大な労力と時間が要求される。また、人間による実験操作は作業の均質化による再現性の向上という点での課題にもなり得る。そのため、我々は比較的単純な実験操作を安価に自動化する機器を作成した。

我々が作成した機器は、電気泳動とその撮影を自動化する装置と、転倒混和を自動化する装置の二つである。それぞれの装置は主に3Dプリンターを用いて部品を作成しており、また手に入りやすい部品を用いている。さらに、部品の点数を少なくすることで使用者が簡単にこれらの機器を実験に導入できるよう心掛けた。

なお、作成に使用した3DデータはすべてiGEM TSUKUBAのGitLabからダウンロードできる。

自動電気泳動装置

概要

ACアダプターから電源を供給し、電気泳動を行う機器を作成した。また、泳動が終了したのちに自動でゲルの撮影を行う機器を作成した。(fig.1)

BlockNote image

fig1: 電気泳動装置概観

使用法

デバイスを組み立て、Arduinoをパソコンに接続してプレビューアプリを起動する。

ゲルをデバイスにセットしたのちDNAをアプライし、上部パーツをセットして電気泳動を開始する。所定の時間泳動をしたのち下部のLEDが点灯してゲルが撮影される。

設計

泳動槽

泳動層にはタッパーを使用しており、電極やアガロースゲルをセットする部品は3Dプリンターを用いて作成している。(fig.2)

BlockNote image

fig2: 泳動槽

電源

電源には12VのACアダプターを使用しており、それをDC-DCコンバーターによって昇圧することで泳動のための電圧を確保している。さらに、電気泳動の速度を速めるために電極間の距離を一般的な電気泳動装置よりも短くしている。

回路

電極間に流れる電流を制御するためにリレースイッチを使用しており、設定した時間で電流を物理的に遮断することができる。(fig.3)

BlockNote image

fig3: DC-DCコンバーターとリレースイッチ

撮影

電気泳動が完了すると装置下部のLEDが点灯し、事前にDNAに添加してあった染料を蛍光させる。

その蛍光の撮影には一般的なWebカメラを使用している。また、さまざまなWebカメラを利用できるように装置への固定は結束バンドを使用している。

プレビュー用ソフトウェア

PythonのライブラリであるFletを利用しており、撮影した写真を撮影時刻と共に閲覧できるようになっている。

実証

電気泳動

上述の装置の内、泳動槽および回路の機能が正しく作動するかを検証するため、DNAマーカーを用いた電気泳動を行った。

下図は90分泳動を行った後のゲルである。図より、電気泳動が正しく行われており、コームの位置による違いもないことが分かる(このゲルの撮影は、既存の撮影機器を用いた)。(fig.4)

BlockNote image

fig4: 電気泳動後のゲル

課題

電気泳動装置を実際に作動させたところ、いくつかの問題点が発見された。

一つ目の問題点は泳動速度が遅いことである。12Vの入力では電圧を十分に上昇させることができず、一般的な泳動装置と比べて三分の一程度の泳動速度にとどまってしまった。

この問題をには、ACアダプターから入力される電圧を上昇させることや、さらに高電圧を出力できる昇圧回路を使用することなどの解決方法が考えられる。

二つ目の問題点はステンレス製の電極が泳動によって溶けてしまったことである。このことは廃液処理や安全性の観点で問題を生むため、より安定なチタン電極や白金電極へと交換することが求められる。

作成用資料

回路図

電気泳動装置

BlockNote image

電気泳動装置の回路図

下部LED(bottom LED)

BlockNote image

下部LED(bottom LED)の回路図

組み立て表

  1. DC-DCコンバーターとACアダプター, リレーモジュール,ファンをつなぐ回路と20AWGの(太い)銅線とT型コネクタをはんだ付けする。そのとき、回路がショートするのを防止するために、T型コネクタの根元やはんだが露出している箇所を熱収縮チューブで保護する。

BlockNote image

DCジャック,DC-DCコンバーター,ファンを接続した基板(表側)

BlockNote image

DCジャック,DC-DCコンバーター,ファンを接続した基板(裏側)

  1. ステンレス電極を120mmにカットし、端に20AWGの(太い)銅線をはんだ付けする、そして電極と銅線の接続箇所を熱収縮チューブで保護する。その後銅線が接続した側の端を約10mm折り曲げる。

  2. ステンレス電極を電気泳動装置中部にセットし、銅線が接続されていない側を少し折り曲げて固定する。その後電極同士をT型コネクタ(オス)で接続する

BlockNote image

電極の配線図

  1. T型コネクタを接続することで、DC-DCコンバーターとDC ジャック, リレーモジュール, ファン, electrophoresis tank(回路図参照)を接続する。ファンはDC-DCコンバーターを冷却できる位置に固定する。DC-DCコンバーターの入力端子側はT型コネクタ(オス)で配線し、出力端子側はT型コネクタ(メス)で配線する。また、出力端子側に電圧計を追加して熱収縮チューブで保護する。

BlockNote image

DC-DCコンバーターの配線図

  1. bottom LED(下部LED)の回路を作成する、LEDはゲルをまんべんなく照らせるように配置する。

  2. Arduinoとタクトスイッチ, リレーモジュール, bottom LEDをジャンパワイヤを用いて配線する。

  3. 下から順に、bottom LED, electrophoresis tank bottom parts, タッパー, electrophoresis tank middle parts, electrophoresis tank top partsの順に重ねる。

BlockNote image

3Dプリント部品とタッパーの組み立て図

  1. Webカメラのレンズを覆うように、オレンジフィルターを設置する。

  2. electrophoresis tank top partsの上部に、結束バンドを用いてWebカメラを固定する。

  3. Arduinoにソースコードを書き込む。

  4. プレビューソフトの使用法を基にソフトを起動する。

部品表

部品名型番個数補足
電気泳動装置上部(electrophoresis tank top parts)13Dプリンターで作成し、素材にPLAを使用
電気泳動装置中部 (electrophoresis tank middle parts)13Dプリンターで作成し、素材にPLAを使用
電気泳動装置下部 (electrophoresis tank bottom parts)13Dプリンターで作成し、素材にPLAを使用
タッパー1縦170mm,横120mm,高さ55mmのタッパーを使用
WebカメラUCAM-C980FBBK1一般的なWebカメラを利用可能
オレンジフィルター1
電極21.2mmのステンレス製針金を使用
DCジャックAE-DC-POWER-JACK-DIP1DIP化されたものを使用
リレーモジュール1JQC-3FF-S-Zを搭載した製品を使用
DC-DCコンバーター1DROK社製の8-32V→8-46Vに変換するモデルを使用
12V 3A ACアダプター1
6cm PCファン112V駆動の製品を使用
泳動層用銅線1大電圧、大電流なので、20AWGのものを使用
DC 電圧ディスプレイ DC 0-100V1DC-DCコンバーターの出力電圧を確認するために必要
青色LED12使用する染料の励起波長に合ったものを使用する
10KΩ抵抗12
ジャンパワイヤ泳動層以外の配線用
Arduino Uno R31ELEGOOの互換品を使用
T型コネクタ(オス)2
T型コネクタ(メス)2
熱収縮チューブ約30cmT型コネクタの根元を覆えるくらいの太さのもの
ユニバーサル基板1(なくてもよい)サイズ:5×7cm, 厚さ:1.2mm, 穴ピッチ2.54mm(0.1インチ) DC-DCコンバーターとリレーモジュール、ファンを接続する際にあると便利

プレビューソフトの使用法

パソコンにPython(Version 3.3以降)をインストールする。

  1. Pythonコードを実行したいディレクトリで以下のコマンドを実行し、仮想環境を作成する。
python -m venv .venv 
  1. コマンドプロンプトで以下のコマンドを実行し、仮想環境を有効化

Windows(command prompt)の場合

.venv\Scripts\activate.bat

Mac,Linuxの場合

source .venv/bin/activate
  1. 仮想環境の有効化に成功すると、以下のようにパスの前に仮想環境の名前が表示される。
(.venv) C:\Users\...
  1. 仮想環境の中で以下のコマンドを実行し、必要なパッケージをインストールする
pip install opencv-python pyserial flet

これでプログラムの実行環境の構築が完了した。

  1. Vscodeの拡張機能でPythonを実行する場合はCtrl+Shift+Pからコマンドパレットを開き、Python: Select Interpreterを選択し、先ほど作成した仮想環境を選択してから実行する。

ソースコード

Arduino


const int outputPin = 2;
const int inputPin = 4;
const int LEDPin = 5;
// 3600000ms = 1hour
unsigned long ELECTROPHORESIS_TIME = 1000 * 60 * 60;

void setup()
{
  Serial.begin(9600);
  pinMode(outputPin, OUTPUT);
  pinMode(LEDPin, OUTPUT);
  pinMode(inputPin, INPUT_PULLUP); 
}

void loop()
{

  if (digitalRead(inputPin) == LOW)
  { /
    digitalWrite(outputPin, HIGH);
    unsigned long start_time = millis();
    unsigned long current_time = millis();
    while (current_time - start_time < ELECTROPHORESIS_TIME)
    {
      current_time = millis();
    }
    digitalWrite(LEDPin, HIGH);
    Serial.println("capture"); // Send instruction to PC
    delay(3000);             
    while (true)
    {
      digitalWrite(outputPin, LOW);
      if (digitalRead(inputPin) == LOW)
      {
        break;
      }
    }
  }
}

プレビューソフト

import cv2
import serial
import flet as ft

from datetime import datetime

# Select Arduino Serial port
ser = serial.Serial('COM4', 9600)  

# Web camera initialization
cap = cv2.VideoCapture(1)

def main(page: ft.Page):
    t = ft.Text(value="Figure", color="black")
    page.add(t)       
    page.update()

    if not cap.isOpened():
        print("Cannot connect Web camera")
        exit()

    print("Waiting...")

    while True: 
         monitor_Serialport(page)


def monitor_Serialport(page):
    if ser.in_waiting > 0:
            line = ser.readline().decode('utf-8').strip()
            print(f"Recieve: {line}")

            if line == "capture":
                ret, frame = cap.read()
                if ret:
                    now = datetime.now()
                    filename = f"photo_{now.strftime("%Y%m%d%H%M%S")}.jpg"
                    cv2.imwrite(filename, frame)
        
                    print(f"saved: {filename}")
            
                    ft_image = ft.Image(src=filename, width=600, height=400)
                    page.add(ft_image)
                    ft_time = ft.Text(value=now, color="black")
                    page.add(ft_time)
                    page.update()
                
                else:
                    print("failed to get iamge")

ft.app(target=main)

cap.release()
ser.close()

転倒混和器

概要

我々は転倒混和の操作を自動化するためサーボモータによる転倒混和器、および転倒混和の速度を連続的に制御し、混和の残り時間を表示するコントローラーを作成した。(fig.5)

BlockNote image

fig5: 転倒混和器の概観

使用法

機械の電源を入れた後、コントローラー上の黒いスイッチを押すと混和時間が10分ずつ追加される。そして転倒混和の速度をコントローラー上のツマミを回すことで調整できる。混和の残り時間が0になると、装置は停止する。

設計

駆動部

混和のための動力にはサーボモータであるSG90を使用している。

これは安価な小型サーボモーターであり、入手しやすくエッペンチューブの転倒混和のために十分なトルクを持っている。

また、駆動部の土台とアームの作成には3Dプリンターを用いている。(fig.6)

BlockNote image

fig6: 転倒混和器の駆動部

コントローラー

機器全体の制御には、Arduino UNOを利用している。これは入手しやすく、7セグメントLEDを動作させるために十分なデジタルピンを備えている。また、PWM制御によってサーボモーターを制御することができる。

また、混和の速度を連続的に調節するためのツマミにはポテンショメーターを使用している。これは可変抵抗の一種であり、電圧を連続的に変化させることができる。そして連続的に変化する電圧をセンサーで読み取り、それを基にしてサーボモーターの運動速度を連続的に制御できる。

転倒混和が終了するまでの残り時間は7セグメントLEDによって表示している。(fig.7)

BlockNote image

fig7: コントローラー

電源

Arduinoとパソコンを接続する、もしくはモバイルバッテリーを接続することで給電し、転倒混和器を動作させることができる。

機器の制御

7セグメントLEDによる残り時間の表示はタイマーを用いた割り込み制御、混和時間の延長はタクトスイッチからの信号をトリガーにした割り込み制御によって実現している。

これによって、サーボモーターの動作を大きく阻害することなく転倒混和器への操作を常に受け付けることができる。

実証

転倒混和器の性能と、長時間の動作に耐えられるかどうかを確認するため、エッペンチューブに二種類の絵の具と水を入れて80分転倒混和を行った。

下図より、多少の溶け残りがあるものの二種類の絵の具が混和されていることが確認された。(fig.8,fig.9)

BlockNote image

fig8: 混和前の試料

BlockNote image

fig9: 混和後の試料

課題

本機器をiGEM TSUKUBAのWetメンバーに使用してもらったところ、以下のような意見が上がった。

  1. 混和の速度をRPMなどの形で表示しないと再現性が確保できない。

  2. サーボモーターが作動するときの音が大きい。

  3. 混和時間の表示はスマホ等のタイマーで行うので必要ない。

これ等の課題を解決するために、アームを駆動させるためのモーターを変更する必要があると考えられた。そこで、我々はモーターをサーボモーターからステッピングモーターに変更することにし、目下改良版のデバイスを作成中である。

作成用資料

回路図

BlockNote image

転倒混和器の配線図

組み立て表

  1. 混和器の土台に、サーボモーターをM2ネジで固定する。

BlockNote image

  1. サーボモーターに付属のネジでサーボホーンを固定する。

BlockNote image

  1. サーボホーンに付属のネジで混和器のアームを固定する。またアームに空いた穴にM3ネジを差し込み、ナットで固定することで回転軸を作る。さらに、その回転軸を土台の軸受けに差し込む。

BlockNote image

  1. 回路図の通りに配線する。

BlockNote image

コントローラーの配線例(表側)

BlockNote image

コントローラーの配線例(裏側)

  1. Arduinoにソースコードを書き込む。

部品表

部品名型番個数補足
サーボモーターSG-901
転倒混和器土台(mixer_base)13Dプリンターで作成し、素材にPLAを使用
転倒混和器アーム(mixer_arm)13Dプリンターで作成し、素材にPLAを使用
M2 12mmネジ&ナット2転倒混和器土台にサーボモーターを固定するのに使用
M3 30mmネジ1転倒混和器アームの回転軸に使用
7セグメント4桁LED5641AS1共通カソード方式
220Ω抵抗4
ポテンショメーターRK09D117000B1
タクトスイッチDTS-63-N-V-BLK(TS-0606-F-N-BLK)1
10kΩ抵抗1
ブレッドボード用ジャンパーワイヤ10~20ブレッドボードで回路を作成する場合は必要
ジャンパ線(オス-メス)17
ユニバーサル基板2サイズ:5×7cm, 厚さ:1.2mm, 穴ピッチ2.54mm(0.1インチ)
ピンヘッダPH-1x40SG20
Arduino Uno R31ELEGOOの互換品を使用

ソースコード

このコードを動作させるには、VarSpeedServo.hライブラリのzip ファイルをネット上からダウンロードし、Arduino IDEで Sketch → **Include Library **→ **ADD .Zip Library…**でダウンロードしたフォルダを選択することでインストールする必要がある。


#include <VarSpeedServo.h>

VarSpeedServo myservo;

int servoPin = 3;
int buttonPin = 2;
int potentiometerPin = 2;
int potentionVal = 0;
long pitchVal = 0;

// pin for Seven-segment display (a~g, dp)
int pinA = A0;
int pinB = A1;
int pinC = 4;
int pinD = 5;
int pinE = 11;
int pinF = 12;
int pinG = 13;
int pinDP = 6;

// digit of Seven-segment display
int D1 = 7;
int D2 = 8;
int D3 = 9;
int D4 = 10;

int segs[8] = {pinA, pinB, pinC, pinD, pinE, pinF, pinG, pinDP};
int digits[4] = {D1, D2, D3, D4};

// signal pattern of Seven-segment display
const int numbers[10][7] = {
    {1, 1, 1, 1, 1, 1, 0}, // 0
    {0, 1, 1, 0, 0, 0, 0}, // 1
    {1, 1, 0, 1, 1, 0, 1}, // 2
    {1, 1, 1, 1, 0, 0, 1}, // 3
    {0, 1, 1, 0, 0, 1, 1}, // 4
    {1, 0, 1, 1, 0, 1, 1}, // 5
    {1, 0, 1, 1, 1, 1, 1}, // 6
    {1, 1, 1, 0, 0, 0, 0}, // 7
    {1, 1, 1, 1, 1, 1, 1}, // 8
    {1, 1, 1, 1, 0, 1, 1}  // 9
};

// variable for timer
volatile int minutes = 0;
volatile int seconds = 0;

unsigned long lastUpdate = 0;

// 表示用
volatile int currentDigit = 0;

volatile unsigned long lastButtonPress = 0;

// define interrupt function for timer
ISR(TIMER2_COMPA_vect)
{

    unsigned long now = millis();

    // count down
    if (now - lastUpdate >= 1000)
    {
        lastUpdate = now;

        if (minutes > 0 || seconds > 0)
        {
            if (seconds > 0)
            {
                seconds--;
            }
            else if (minutes > 0)
            {
                minutes--;
                seconds = 59;
            }
        }
    }

    int d[4];
    d[0] = (minutes / 10) % 10;
    d[1] = minutes % 10;
    d[2] = (seconds / 10) % 10;
    d[3] = seconds % 10;

    for (int i = 0; i < 4; i++)
        digitalWrite(digits[i], HIGH);

    // select signal pattern
    for (int i = 0; i < 7; i++)
    {
        digitalWrite(segs[i], numbers[d[currentDigit]][i] ? HIGH : LOW);
    }

    digitalWrite(pinDP, (currentDigit == 1) ? HIGH : LOW);

    // select digit
    digitalWrite(digits[currentDigit], LOW);

    currentDigit = (currentDigit + 1) % 4;
}

void setup()
{

    for (int i = 0; i < 8; i++)
        pinMode(segs[i], OUTPUT);

    for (int i = 0; i < 4; i++)
    {
        pinMode(digits[i], OUTPUT);
        digitalWrite(digits[i], HIGH);
    }

    myservo.attach(servoPin);
    myservo.write(0, 30, true);
    pinMode(buttonPin, INPUT);
    Serial.begin(9600);

    // initialize interrupt function for adding mixing time
    attachInterrupt(digitalPinToInterrupt(buttonPin), addTime, FALLING);

    // initialize timer
    cli();
    TCCR2A = 0;
    TCCR2B = 0;
    TCNT2 = 0;
    OCR2A = 249;
    TCCR2A |= (1 << WGM21);
    TCCR2B |= (1 << CS22) | (1 << CS21);

    TIMSK2 |= (1 << OCIE2A);
    sei();
}

// function for adding mixing time
void addTime()
{
    unsigned long now = millis();
    if (now - lastButtonPress > 200)
    {
        minutes = minutes + 10;
        Serial.println("added");
        lastButtonPress = now;
    }
}

void upArm(long speedVal)
{
    myservo.write(180, speedVal, true);
}

void downArm(long speedVal)
{
    myservo.write(0, speedVal, true);
}

void loop()
{

    while (minutes == 0 && seconds == 0)
    {
        Serial.println("Waiting");
    }

    pitchVal = map(analogRead(potentiometerPin), 0, 1023, 20, 200);
    upArm(pitchVal);

    pitchVal = map(analogRead(potentiometerPin), 0, 1023, 20, 200);
    downArm(pitchVal);
}

結果

我々はラボラトリーオートメーションによってハイスループットな実験環境を実現するためのデバイスを作成した。電気泳動装置は電気泳動と撮影を自動化することを目的にして作成され、比較的安価に大電圧での電気泳動を実現した。

転倒混和器はサーボモーターを活用することで安価かつ容易に組み立てることができ、実際のWet実験でその機能を検証することができた。さらに、検証によって動作音の大きさや再現性の問題など、実際のWet実験の現場からの知見を得ることで装置の改良へとつなげることができた。

Slide 1Slide 2Slide 3Slide 4Slide 5

© 2025 - Content on this site is licensed under a Creative Commons Attribution 4.0 International license

The repository used to create this website is available at gitlab.igem.org/2025/tsukuba.