-
Week 11
01/19/2021 at 04:29 • 0 commentsThis week, we updated the circuit board (light and motor control board) for our micro-plate reader, it envolved diffrent stages: 1. Design and update components on the previous board( the one we used before) and reroute the electric wire on the whole board. 2. update all the files to lichuang EDA ( BOM fule, pick and place file and Gerber file). 3. Order the board online and wait for EDA to manufacture and produce the board. As shown below, we are measuring the length between two female headers( the outlet).
https://www.bilibili.com/video/BV1ch411f7CY<iframe src="//player.bilibili.com/player.html?aid=203253323&bvid=BV1ch411f7CY&cid=271620831&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
Here's the link to a video that shows how the micro-plate functions and how we adjust the detail of it.
-
Week 9 +2/3 Days
12/27/2020 at 09:18 • 0 commentsOn Day 2 of Week 9, we suffered great loss, our belt receiving gear left us forever, so we decided to remake it with a higher infill rate. And today we finally assembled the X-axis and Y-axis components of the motor, with the belt included and gears needed to receive the belt! Actually a few days ago we already had 3D printed most of the components, however, many of the first draft components broke due to insufficient infill and not careful handling. Therefore, we had to revise the models and reassemble them onto the assembled aluminium beams.
After we finished assembling these components, we then worked on the code to control both motors' movements and directions. Although it took some time, we were finally able to figure out the code suited:
// System Inialization Setup
String protocolString = "";
boolean protocolWait = false;
String parsedString = "";
int startIndex = 0;
String totalString = "";
String ledString = "";
unsigned long Timecount1;
unsigned long Durationcount1;
unsigned long Time1;
unsigned long Duration1;
unsigned long Timecount2;
unsigned long Durationcount2;
unsigned long Time2;
unsigned long Duration2;
unsigned Direction1;
unsigned Direction2;
int DIRCount1 = 0;
int DIRCount2 = 1;
const int DIRPin1 = 2;
const int STEPPin1 = 3;
const int ENNPin1 = 7;
const int DIRPin2 = 6;
const int STEPPin2 = 5;
int STEPState1 = LOW;
int DIRState1 = HIGH;
int STEPState2 = LOW;
int DIRState2 = HIGH;void initOutput() {
//digitalWrite(ENNpin,HIGH); // Disable motors
//We are going to overwrite the Timer1 to use the stepper motors
// STEPPER MOTORS INITIALIZATION
// TIMER1 CTC MODE
TCCR1B &= ~(1<<WGM13);
TCCR1B |= (1<<WGM12);
TCCR1A &= ~(1<<WGM11);
TCCR1A &= ~(1<<WGM10);// output mode = 00 (disconnected)
TCCR1A &= ~(3<<COM1A0);
TCCR1A &= ~(3<<COM1B0);// Set the timer pre-scaler
// Generally we use a divider of 8, resulting in a 2MHz timer on 16MHz CPU
TCCR1B = (TCCR1B & ~(0x07<<CS10)) | (2<<CS10);//OCR1A = 125; // 16Khz
//OCR1A = 100; // 20Khz
OCR1A = 250; // 25Khz
TCNT1 = 0;TIMSK1 |= (1<<OCIE1A); // Enable Timer1 interrupt
//digitalWrite(ENNpin, LOW); // Enable stepper drivers
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
pinMode(DIRPin1, OUTPUT);
pinMode(STEPPin1, OUTPUT);
pinMode(DIRPin2, OUTPUT);
pinMode(STEPPin2, OUTPUT);
pinMode(ENNPin1, OUTPUT);
digitalWrite(DIRPin1, HIGH);
digitalWrite(STEPPin1, LOW);
digitalWrite(DIRPin2, LOW);
digitalWrite(STEPPin2, HIGH);
digitalWrite(ENNPin1, LOW);
initOutput();
}void loop() {
// Serial.println("pass");
if (Serial.available() > 0) {
protocolString = Serial.readString();
Serial.println(protocolString);
for (int i = 0; i <= protocolString.length(); i++){ // Analyze command string one character at a time
parsedString = protocolString.substring(i,i+1);
if (parsedString == "~"){ // '~' Symbolizes the end of a command
if (protocolString.substring(startIndex, startIndex+3) == "LED"){
totalString = protocolString.substring(startIndex,i);
Serial.println(totalString.length());
if (totalString.length() <= 4){
ledString = protocolString.substring(startIndex+3,i);
if (ledString == "1"){
digitalWrite(2, !digitalRead(2));
}
else if (ledString == "2"){
digitalWrite(3, !digitalRead(3));
}
}
}
else if(protocolString.substring(startIndex, startIndex+1) == "M"){
Timecount1 =0;
Time1 = protocolString.substring(startIndex+1,i-9).toInt();
Direction1 = protocolString.substring(startIndex+6,i-8).toInt();
Durationcount1 =0;
Duration1 = protocolString.substring(startIndex+7,i-7).toInt();
Timecount2 =0;
Time2 = protocolString.substring(startIndex+8,i-2).toInt();
Direction2 = protocolString.substring(startIndex+13,i-1).toInt();
Durationcount2 =0;
Duration2 = protocolString.substring(startIndex+14,i).toInt();
Serial.println("done");
Serial.print(Time1);
Serial.println("");
Serial.print(Direction1);
Serial.println("");
Serial.print(Duration1);
Serial.println("");
Serial.print(Time2);
Serial.println("");
Serial.print(Direction2);
Serial.println("");
Serial.print(Duration2);
}
else if (protocolString.substring(startIndex, startIndex+1) == "T"){
totalString = protocolString.substring(startIndex,i);
Serial.println(totalString.length());
if (totalString.length() <= 4){
ledString = protocolString.substring(startIndex+3,i);
if (ledString == "1"){
digitalWrite(2, !digitalRead(2));
}
else if (ledString == "2"){
digitalWrite(3, !digitalRead(3));
}
}
}
}
}
}
}ISR(TIMER1_COMPA_vect){
// digitalWrite(STEPPin1, 1);
// delayMicroseconds(1);
// digitalWrite(STEPPin1, 0);
if (Direction1 <= DIRCount1){
digitalWrite(DIRPin1, LOW);
}
if (Direction1 >= DIRCount2){
digitalWrite(DIRPin1,HIGH);
}
if (Direction2 <= DIRCount1){
digitalWrite(DIRPin2, LOW);
}
if (Direction2 >= DIRCount2){
digitalWrite(DIRPin2,HIGH);
}if (Timecount1 < Time1) {
if (Durationcount1 < Duration1) {
if (STEPState1 == LOW) {
STEPState1 = HIGH;
} else {
STEPState1 = LOW;
}
digitalWrite(STEPPin1, STEPState1);
Durationcount1++;
}
if (Durationcount1 >= Duration1) {
Timecount1++;
Durationcount1 =0;
}
}
else if(Timecount1 >= Time1) {
digitalWrite(STEPPin1, 0);
}
if (Timecount2 < Time2) {
if (Durationcount2 < Duration2) {
if (STEPState2 == LOW) {
STEPState2 = HIGH;
} else {
STEPState2 = LOW;
}
digitalWrite(STEPPin2, STEPState2);
Durationcount2++;
}
if (Durationcount2 >= Duration2) {
Timecount2++;
Durationcount2 =0;
}
}
else if(Timecount2 >= Time2) {
digitalWrite(STEPPin2, 0);
}
} -
week 10
12/27/2020 at 06:42 • 0 commentsIn the morning, we finalized the prototype for the x-y axis of the micro plate reader. Despite it is not the final model that we will be using, the prototype is functioning properly as it moves along the x-axis and y-axis. In the image below, you can see that the micro plate is ready !( somehow).
This is the position where the optical train will operate and illuminate the sample( just to show the idea).
In the afternoon, we learnt the coding part. Our attempt is to expand our knowledge on coding and create a program for the blinking of LED light( we will replace LED light with motor when we master the coding part) However, all of us but warren failed to complete the program. ( warren is drawing the sketch for the prototype !!! featuring warren and Dr. xu).
-
Week 9
12/24/2020 at 07:26 • 0 commentsThis week, we will be having four continuous days that we can utilize to continue work on our microplate reader, and because its Christmas Eve today we were all super happy!
As we try try again to write out the code to control the number of times the LED light will blink, the duration of the light to be on, and the duration of the light to be off, one of us finally succeeded in writing out the code in the afternoon! The reason why we tried to write out the code to manipulate a LED light was because the code behind controlling a motor, in which regulates how the plate holder will move in both X and Y directions, is actually quite similar to the code controlling the LED light. The number of times the LED light will blink corresponds to the number of times the motor will move and the duration of each blink corresponds to the movement of each step of the motor's movements.
Adding on, we also assembled the beams, the belt, and the track that regulates how the plate holder will move along the X-axis with those that control the plate holder moving along the Y-axis.
The sense of accomplishment, finally getting things done after weeks of preparation, drilling holes, 3D printing models, and learning how to code, feels just so good as our hears are filled with pride and happiness.
-
week 8
12/19/2020 at 10:08 • 0 commentsThis week, we finalized the hole drilling part for our aluminium beam and constructed them together( as shown below).
This part will become our Y-axis of the micro plate reader. (ps: we are still printing the accessory for immobilization).
-
Week 7
12/12/2020 at 06:28 • 0 commentsWe finish the drilling of the aluminum bars for the x and y-axis of the microplate on the CNC. The milling model uploaded was designed last week. We ran the process without the blade once to make sure no errors were made.
We started to write the program to turn the LED lights on and off on the apparatus. The pin on the Arduino Uno we chose were 2 and 4. We utilized serial transmission to send the command to the Uno. Then, the serial monitor was used to sending commends that were present in the program to the Arduino. The lights are able to be controlled now. Parts of the program were referencing alternating sources.
-
Week 6
12/12/2020 at 05:57 • 0 commentsWe were not able to upload and report our progress last week, therefore, we are publishing week 5's log this week. Last week, after we successfully connected the belt, which allows the motor to control the plate holder to move along the X-axis, with the plate holder, we started to devise ways to enable the plate holder to move along the Y-axis. Since we cannot do the same thing with the Y-axis to make the plate holder move sideways because the beams have fixed positions and the only way to make the plate holder move along the Y-axis is to make the whole setup move altogether. Therefore, we begin to plan how are we going to drill the holes on the aluminum beams. We first created a 3D image of the beam via Fusion 360 and then utilized the manufacturing features of it and came up with the pathway of how the holes of the beams shall be drilled by CNC. Unfortunately, the builder we were working in had an interrupted electricity supply and we were not able to use anything, including machines, the wifi, and the plugs, that used electricity, so we went home early:)
-
Week 5
11/29/2020 at 07:56 • 0 commentsThis week, we successfully constructed the X-axis of the detector as part of the main component of the device. Despite the fact that the band track was a bit loose, we were able to adjust it simply using pilers. ( as shown in the image below)
This picture shows the complete model of the sample holder. we designed the model via Fusion 360 and printed it with a 3D printer.
Apart from the actual making of the micro plate reader, we designed the control panel for the micro plate reader( it finally arrived last weekend !) Based on the mistakes and flaws from the last control panel, we updated the data and made a couple of minor changes on the construction of circuit, hopefully it will work this time!
Last but not least, we started with the Arduino programming part. Although it is difficult and hard to scrutinize, I think we we will work this out in the future. ( here is an example of the coding part, featuring warren's laptop).
-
Week 4
11/08/2020 at 10:20 • 0 commentsAs I'm temporarily separated from the rest of my group-mates, I continued with the laser cutting part of the microplate reader. Today, I finalized the sketch for the right panel holder and its door and cut the right panel with only a few minor issues left.
This image shows the completed right panel and the front panel. The conjunction component provides versatility for the microplate reader as a whole and it enables the door to move in 180 degrees. We also constructed the front side of the microplate reader with the help of another student, as most of the laser cutting parts are done, we will enter the next section of the assembly next week.
-
Week 3
11/07/2020 at 10:02 • 0 commentsAs we continue to work on building the outer pieces of the plate reader that needs to be laser cutted. The main focus of the day was that we worked on 3D printing and installing several of the pieces crucial for the motor, the belt, and the plate holder to cooperate better. We had quite a tough time making slight changes to the plate holder,
the holder meant for holding samples in the future, since our plate reader's dimensions and the motors we are using more quite different from the original one. In addition, we also added a piece on top of a motor in order to adjust the height of the motor to make the belt stable and maintain the same elevation throughout. Overall it was quite a successful day as we were able to continue to progress and as we are becoming more and more skilled and confident with the tools we are using.