


我々が行っている研究はAIによって有用と推測されるアミノ酸配列を多数生成し、それらをアッセイすることで本システムの有用性を示していくというものである。これらの作業をすべて人力で行うには多大な労力と時間が要求される。また、人間による実験操作は作業の均質化による再現性の向上という点での課題にもなり得る。そのため、我々は比較的単純な実験操作を安価に自動化する機器を作成した。
我々が作成した機器は、電気泳動とその撮影を自動化する装置と、転倒混和を自動化する装置の二つである。それぞれの装置は主に3Dプリンターを用いて部品を作成しており、また手に入りやすい部品を用いている。さらに、部品の点数を少なくすることで使用者が簡単にこれらの機器を実験に導入できるよう心掛けた。
なお、作成に使用した3DデータはすべてiGEM TSUKUBAのGitLabからダウンロードできる。
ACアダプターから電源を供給し、電気泳動を行う機器を作成した。また、泳動が終了したのちに自動でゲルの撮影を行う機器を作成した。(fig.1)

fig1: 電気泳動装置概観
デバイスを組み立て、Arduinoをパソコンに接続してプレビューアプリを起動する。
ゲルをデバイスにセットしたのちDNAをアプライし、上部パーツをセットして電気泳動を開始する。所定の時間泳動をしたのち下部のLEDが点灯してゲルが撮影される。
泳動層にはタッパーを使用しており、電極やアガロースゲルをセットする部品は3Dプリンターを用いて作成している。(fig.2)

fig2: 泳動槽
電源には12VのACアダプターを使用しており、それをDC-DCコンバーターによって昇圧することで泳動のための電圧を確保している。さらに、電気泳動の速度を速めるために電極間の距離を一般的な電気泳動装置よりも短くしている。
電極間に流れる電流を制御するためにリレースイッチを使用しており、設定した時間で電流を物理的に遮断することができる。(fig.3)

fig3: DC-DCコンバーターとリレースイッチ
電気泳動が完了すると装置下部のLEDが点灯し、事前にDNAに添加してあった染料を蛍光させる。
その蛍光の撮影には一般的なWebカメラを使用している。また、さまざまなWebカメラを利用できるように装置への固定は結束バンドを使用している。
PythonのライブラリであるFletを利用しており、撮影した写真を撮影時刻と共に閲覧できるようになっている。
電気泳動
上述の装置の内、泳動槽および回路の機能が正しく作動するかを検証するため、DNAマーカーを用いた電気泳動を行った。
下図は90分泳動を行った後のゲルである。図より、電気泳動が正しく行われており、コームの位置による違いもないことが分かる(このゲルの撮影は、既存の撮影機器を用いた)。(fig.4)

fig4: 電気泳動後のゲル
電気泳動装置を実際に作動させたところ、いくつかの問題点が発見された。
一つ目の問題点は泳動速度が遅いことである。12Vの入力では電圧を十分に上昇させることができず、一般的な泳動装置と比べて三分の一程度の泳動速度にとどまってしまった。
この問題をには、ACアダプターから入力される電圧を上昇させることや、さらに高電圧を出力できる昇圧回路を使用することなどの解決方法が考えられる。
二つ目の問題点はステンレス製の電極が泳動によって溶けてしまったことである。このことは廃液処理や安全性の観点で問題を生むため、より安定なチタン電極や白金電極へと交換することが求められる。

電気泳動装置の回路図

下部LED(bottom LED)の回路図

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

DCジャック,DC-DCコンバーター,ファンを接続した基板(裏側)
ステンレス電極を120mmにカットし、端に20AWGの(太い)銅線をはんだ付けする、そして電極と銅線の接続箇所を熱収縮チューブで保護する。その後銅線が接続した側の端を約10mm折り曲げる。
ステンレス電極を電気泳動装置中部にセットし、銅線が接続されていない側を少し折り曲げて固定する。その後電極同士をT型コネクタ(オス)で接続する

電極の配線図

DC-DCコンバーターの配線図
bottom LED(下部LED)の回路を作成する、LEDはゲルをまんべんなく照らせるように配置する。
Arduinoとタクトスイッチ, リレーモジュール, bottom LEDをジャンパワイヤを用いて配線する。
下から順に、bottom LED, electrophoresis tank bottom parts, タッパー, electrophoresis tank middle parts, electrophoresis tank top partsの順に重ねる。

3Dプリント部品とタッパーの組み立て図
Webカメラのレンズを覆うように、オレンジフィルターを設置する。
electrophoresis tank top partsの上部に、結束バンドを用いてWebカメラを固定する。
Arduinoにソースコードを書き込む。
プレビューソフトの使用法を基にソフトを起動する。
| 部品名 | 型番 | 個数 | 補足 |
| 電気泳動装置上部(electrophoresis tank top parts) | 1 | 3Dプリンターで作成し、素材にPLAを使用 | |
| 電気泳動装置中部 (electrophoresis tank middle parts) | 1 | 3Dプリンターで作成し、素材にPLAを使用 | |
| 電気泳動装置下部 (electrophoresis tank bottom parts) | 1 | 3Dプリンターで作成し、素材にPLAを使用 | |
| タッパー | 1 | 縦170mm,横120mm,高さ55mmのタッパーを使用 | |
| Webカメラ | UCAM-C980FBBK | 1 | 一般的なWebカメラを利用可能 |
| オレンジフィルター | 1 | ||
| 電極 | 2 | 1.2mmのステンレス製針金を使用 | |
| DCジャック | AE-DC-POWER-JACK-DIP | 1 | DIP化されたものを使用 |
| リレーモジュール | 1 | JQC-3FF-S-Zを搭載した製品を使用 | |
| DC-DCコンバーター | 1 | DROK社製の8-32V→8-46Vに変換するモデルを使用 | |
| 12V 3A ACアダプター | 1 | ||
| 6cm PCファン | 1 | 12V駆動の製品を使用 | |
| 泳動層用銅線 | 1 | 大電圧、大電流なので、20AWGのものを使用 | |
| DC 電圧ディスプレイ DC 0-100V | 1 | DC-DCコンバーターの出力電圧を確認するために必要 | |
| 青色LED | 12 | 使用する染料の励起波長に合ったものを使用する | |
| 10KΩ抵抗 | 12 | ||
| ジャンパワイヤ | 泳動層以外の配線用 | ||
| Arduino Uno R3 | 1 | ELEGOOの互換品を使用 | |
| T型コネクタ(オス) | 2 | ||
| T型コネクタ(メス) | 2 | ||
| 熱収縮チューブ | 約30cm | T型コネクタの根元を覆えるくらいの太さのもの | |
| ユニバーサル基板 | 1(なくてもよい) | サイズ:5×7cm, 厚さ:1.2mm, 穴ピッチ2.54mm(0.1インチ) DC-DCコンバーターとリレーモジュール、ファンを接続する際にあると便利 |
パソコンにPython(Version 3.3以降)をインストールする。
python -m venv .venv
Windows(command prompt)の場合
.venv\Scripts\activate.bat
Mac,Linuxの場合
source .venv/bin/activate
(.venv) C:\Users\...
pip install opencv-python pyserial flet
これでプログラムの実行環境の構築が完了した。
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)

fig5: 転倒混和器の概観
機械の電源を入れた後、コントローラー上の黒いスイッチを押すと混和時間が10分ずつ追加される。そして転倒混和の速度をコントローラー上のツマミを回すことで調整できる。混和の残り時間が0になると、装置は停止する。
混和のための動力にはサーボモータであるSG90を使用している。
これは安価な小型サーボモーターであり、入手しやすくエッペンチューブの転倒混和のために十分なトルクを持っている。
また、駆動部の土台とアームの作成には3Dプリンターを用いている。(fig.6)

fig6: 転倒混和器の駆動部
機器全体の制御には、Arduino UNOを利用している。これは入手しやすく、7セグメントLEDを動作させるために十分なデジタルピンを備えている。また、PWM制御によってサーボモーターを制御することができる。
また、混和の速度を連続的に調節するためのツマミにはポテンショメーターを使用している。これは可変抵抗の一種であり、電圧を連続的に変化させることができる。そして連続的に変化する電圧をセンサーで読み取り、それを基にしてサーボモーターの運動速度を連続的に制御できる。
転倒混和が終了するまでの残り時間は7セグメントLEDによって表示している。(fig.7)

fig7: コントローラー
Arduinoとパソコンを接続する、もしくはモバイルバッテリーを接続することで給電し、転倒混和器を動作させることができる。
7セグメントLEDによる残り時間の表示はタイマーを用いた割り込み制御、混和時間の延長はタクトスイッチからの信号をトリガーにした割り込み制御によって実現している。
これによって、サーボモーターの動作を大きく阻害することなく転倒混和器への操作を常に受け付けることができる。
転倒混和器の性能と、長時間の動作に耐えられるかどうかを確認するため、エッペンチューブに二種類の絵の具と水を入れて80分転倒混和を行った。
下図より、多少の溶け残りがあるものの二種類の絵の具が混和されていることが確認された。(fig.8,fig.9)

fig8: 混和前の試料

fig9: 混和後の試料
本機器をiGEM TSUKUBAのWetメンバーに使用してもらったところ、以下のような意見が上がった。
混和の速度をRPMなどの形で表示しないと再現性が確保できない。
サーボモーターが作動するときの音が大きい。
混和時間の表示はスマホ等のタイマーで行うので必要ない。
これ等の課題を解決するために、アームを駆動させるためのモーターを変更する必要があると考えられた。そこで、我々はモーターをサーボモーターからステッピングモーターに変更することにし、目下改良版のデバイスを作成中である。

転倒混和器の配線図




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

コントローラーの配線例(裏側)
| 部品名 | 型番 | 個数 | 補足 |
| サーボモーター | SG-90 | 1 | |
| 転倒混和器土台(mixer_base) | 1 | 3Dプリンターで作成し、素材にPLAを使用 | |
| 転倒混和器アーム(mixer_arm) | 1 | 3Dプリンターで作成し、素材にPLAを使用 | |
| M2 12mmネジ&ナット | 2 | 転倒混和器土台にサーボモーターを固定するのに使用 | |
| M3 30mmネジ | 1 | 転倒混和器アームの回転軸に使用 | |
| 7セグメント4桁LED | 5641AS | 1 | 共通カソード方式 |
| 220Ω抵抗 | 4 | ||
| ポテンショメーター | RK09D117000B | 1 | |
| タクトスイッチ | 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-1x40SG | 20 | |
| Arduino Uno R3 | 1 | ELEGOOの互換品を使用 |
このコードを動作させるには、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実験の現場からの知見を得ることで装置の改良へとつなげることができた。





© 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.