這一次是用電腦控制步進馬達的轉速
打開arduino介面才發現...單晶片處於失控狀態
我在猜可能是單晶片的電流不夠大,無法推動達零頓電路的大電流
(我用的atmega168每隻腳最多輸入輸出40mA,而步進馬達則會用掉600mA...)

蘇兄 發表在 痞客邦 留言(0) 人氣()

工程師就跟功率晶體一樣容易過熱又短命,而且爆掉了還很好更換,我想好處是身體壞掉的時候腦袋狀況還是很好,至少不會老年癡呆吧

蘇兄 發表在 痞客邦 留言(0) 人氣()

四線步進馬達.jpg
雖然都是雙相步進馬達,但是四線步進馬達跟五,六線步進馬達的驅動電路很不一樣,因為四線步進馬達是雙極馬達,雙極的意思是說,A跟B相位的電流會有兩個方向。而六線式因為有共用腳,所以電流就只有單一方向了。
四線馬達可以使得A0-->A1或是A0<---A1    (箭頭是電流方向)
五,六線馬達則"只"能A0-->A1或"只"能A0<---A1
請參考下面的圖片

蘇兄 發表在 痞客邦 留言(3) 人氣()


一顆16腳的IC,
有7組NPN達靈頓電路
相當於7顆9013,真是太棒了
用那個做光劍一定可以大大縮小體積

蘇兄 發表在 痞客邦 留言(0) 人氣()

IMG_0026.JPG
所需的材料至少要有:
1.塑膠瓦愣板(依照你需要的大小)
2.LED數顆
3.最重要的~PVC鏡面塑膠板: 外表看起來像鏡子...可是放到案暗處會變成半透明的紙...A4大小約20~30元

蘇兄 發表在 痞客邦 留言(1) 人氣()

現在已經回到台灣了
 
以後做實驗都拍照記錄一下好了...
 

蘇兄 發表在 痞客邦 留言(0) 人氣()

arduino與PC端的通信( PC送信給arduino )
這個是源碼https://www.4shared.com/file/RkTtxTCq/INPUT.html
我用來控制兩顆servo motor,控制方式是輸入 X+"角度";Y+"角度";
要說比較奇怪的地方...就是每接收一個字元都必須有1ms的delay,否則收到得字串會錯誤

蘇兄 發表在 痞客邦 留言(0) 人氣()

如果輸入"X 3",輸出 3 = 3
如果輸入"X 23",輸出 23 = 20 + 3
如果輸入"X 234",輸出 233 = 199 + 30 + 4
如果輸入"X 2345",輸出 2344 = 1999 + 300 + 40 + 4

蘇兄 發表在 痞客邦 留言(0) 人氣()

這個範例所使用的是加速度感應器
耐心好重要...我常常缺乏看程式的耐心
import processing.serial.*;
Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port
int i;
int X[] = {0};//x軸加速度
int Y[] = {0};//y軸加速度
int Z[] = {0}//;z軸加速度
void setup()
{
  size(400, 400);
  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}
void draw()
{
  if ( myPort.available() > 0)
  {
    String val = myPort.readStringUntil('\n');
    if (val != null)
    {      
      val = trim(val);//如果val = X123 Y456 Z789,空白會被清除掉
      String getX = val.substring(val.indexOf("X")+1,val.indexOf("Y"));//從X擷取到Y,會擷取出123 // intdexOf可以指出某個元素的位置
      String getY = val.substring(val.indexOf("Y")+1,val.indexOf("Z"));//從Y擷取到Z,會擷取出456
      String getZ = val.substring(val.indexOf("Z")+1);////從Z擷取,會擷取出789
      //println("X" + getX + "Y" + getY + "Z" + getZ); //(學習筆記,可以這樣顯示)
      X[0] = Integer.parseInt(getX);//x軸加速度,把string轉int儲存
      Y[0] = Integer.parseInt(getY);//y軸加速度,把string轉int儲存
      Z[0] = Integer.parseInt(getZ);//z軸加速度,把string轉int儲存       
      plot();
    }
  }
}
void plot()
{
  background(0);
  text(X[0],100,100);
  text(Y[0],200,100);
  text(Z[0],300,100);
}
//arduino
/*
// ADXL3xx
//
// Reads an Analog Devices ADXL3xx accelerometer and communicates the
// acceleration to the computer.  The pins used are designed to be easily
// compatible with the breakout boards from Sparkfun, available from:
// https://www.sparkfun.com/commerce/categories.php?c=80
//
// https://www.arduino.cc/en/Tutorial/ADXL3xx
//
// The circuit:
// analog 0: accelerometer self test
// analog 1: z-axis
// analog 2: y-axis
// analog 3: x-axis
// analog 4: ground
// analog 5: vcc
//
// created 2 Jul 2008
// by David A. Mellis
// modified 26 Jun 2009
// by Tom Igoe
// these constants describe the pins. They won't change:
const int groundpin = 18;             // analog input pin 4 -- ground
const int powerpin = 19;              // analog input pin 5 -- voltage
const int xpin = 1;                   // x-axis of the accelerometer
const int ypin = 2;                   // y-axis
const int zpin = 3;                   // z-axis (only on 3-axis models)
void setup()
{
  // initialize the serial communications:
  Serial.begin(9600);
 
  // Provide ground and power by using the analog inputs as normal
  // digital pins.  This makes it possible to directly connect the
  // breakout board to the Arduino.  If you use the normal 5V and
  // GND pins on the Arduino, you can remove these lines.
  pinMode(groundpin, OUTPUT);
  pinMode(powerpin, OUTPUT);
  digitalWrite(groundpin, LOW);
  digitalWrite(powerpin, HIGH);
}
void loop()
{
  // print the sensor values:
  int x = analogRead(xpin);
  int y = analogRead(ypin);
  int z = analogRead(zpin);
  Serial.print("X");
  Serial.print(x);
  Serial.print("Y");
  Serial.print(y);
  Serial.print("Z");
  Serial.print(z);
  Serial.println();
  // delay before next reading:
  delay(100);
}
*/

蘇兄 發表在 痞客邦 留言(0) 人氣()

最近在實驗一個計畫,利用加速度感測器讀取信號。再傳給電腦,電腦會讀出加速度的不同,然後播出不同的聲音。
 
現在我的問題應該是抓取了太多的信號,那些信號在暫存區裡,等著傳到電腦。所以會使得揮刀跟播出的聲音不同時。
 

蘇兄 發表在 痞客邦 留言(0) 人氣()

//  2 servo motor
#include <Servo.h>
Servo servo1;
Servo servo2;
int pos1[] = {89,90};
int pos2[] = {89,90};
// read degree的副程式會用到的變數
int i = 0;
int j = 0;
int flag;
char W[8];
char w[8];
int N[8];
void setup()
{
  Serial.begin(9600);
  for( j = 0; j < 7; j++)
  {
    w[j] = '0';
    W[j] = '0';
  }
  servo1.attach(4);//舵機一接pin4
  servo2.attach(8);//舵機一接pin8
  motor();//先把兩個舵機轉到90度
}
void loop()
{
  while(Serial.available() > 0)
  {
    my_Read_Degree();
    if( pos1[1] != pos1[0] || pos2[1] != pos2[0])
    {
      Serial.println("rotate!!");
      motor();
    }
  }
}
void motor()//單純讀取輸入的角度,並同時旋轉兩個舵機的副程式
{
  int j = pos1[0];
  int k = pos2[0];  
  while( pos1[1] != pos1[0] || pos2[1] != pos2[0] )//輸入的角度不等於初始角度時開始執行
  {
    if( pos1[1] > j )
    {    
      servo1.write(j);
      j++;//每次順轉一度
    }
    else if( pos1[1] < j )
    {
      servo1.write(j);
      j--;//每次逆轉一度
    }
    else if( pos1[1] == j )
    {
      pos1[0] = pos1[1];
    }
    
    if( pos2[1] > k )
    {    
      servo2.write(k);
      k++;
    }
    else if( pos2[1] < k )
    {
      servo2.write(k);
      k--;
    }
    else if( pos2[1] == k )
    {
      pos2[0] = pos2[1];
    }
    delay(15);//給15ms讓馬達轉一度
  }
  if( pos1[0] == pos1[1] && pos2[0] == pos2[1] )//當馬達旋轉到指定角度時,顯示在螢幕上
  {
    Serial.println("Arrive!");
    Serial.print(pos1[0]);
    Serial.print(",");
    Serial.println(pos2[0]);
  }  
}
 
void my_Read_Degree()
{
  while(Serial.available() > 0) //當用電腦輸入字元時, Serial.available() > 0, 不輸入時, Serial.available() = -1
  {
    W[i] = Serial.read();
    Serial.println(W[i]);    
    if( W[i] == ',' )
    {
      flag = i;
    }
    i++;//這裡的i用來計算輸入的字元數
  }  
 
  if( i > 0 )
  {// j = 7,表示我輸入的角度最多可以是 xxx,yyy共七個字元
    for( j = 0; j < 7; j++)//先平移第一個輸入角度
    {
      w[ j + 3 - flag ] = W[j];
    }
    for( j = 0; j < 7; j++)
    {      
      W[j] = w[j];
    }
    for( j = 0; j < 7 ; j++)
    {
      if( j == 4 )
      {
        int val = i - flag -1 ;
        if( val == 1 )//如果第二個角度是一位數
        {
          w[4] = '0';//補兩個0
          w[5] = '0';
          w[6] = W[4];
        }
        else if( val == 2 )//如果第二個角度是二位數
        {
          w[4] = '0';//補一個零
          w[5] = W[4];
          w[6] = W[5];
        }//三位數就不用補零了
      }
    }
    for( j = 0; j < 7; j++)
    {
      N[j] = w[j] - 48; //(char -> int ), 0的ASCII是48
    }    
    pos1[1] = 100*N[0] + 10*N[1] + N[2];//轉換並計算舵機一的角度
    pos2[1] = 100*N[4] + 10*N[5] + N[6];//轉換並計算舵機二的角度
    if( pos1[1] > 180 || pos2[1] > 180 || pos1[1] < 0 || pos2[1] < 0 ) //如果輸入的角度超過180度或小於0度,則使得輸入無效
    {
      Serial.println("Incorrect angle!");
      Serial.print(pos1[1]);
      Serial.print(",");
      Serial.println(pos2[1]);
      pos1[1] = pos1[0];
      pos2[1] = pos2[0];
    }
    else//如果輸入得正確,就把角度儲存下來,主程式運行到motor)時,就可以用了
    {
      Serial.print("Recive angle: ");
      Serial.print(pos1[1]);
      Serial.print(",");
      Serial.println(pos2[1]);
    }
    for( j = 0; j < 7; j++) //每次輸入完角度,要把角度重新歸零,否則下一次輸入時會輸入錯誤(什麼時候該儲存,儲存多少個字元的問題)
    {
      w[j] = '0';
      W[j] = '0';
    }
    i = 0;
    j = 0;
  }
}

蘇兄 發表在 痞客邦 留言(0) 人氣()

/* by angel91250
lightsaber ver.1
有伸縮功能
下一個版本要加入聲音
*/
int pin[] = {2,3,4,5,6,7,8};//我使用了七組LED,每組10顆,一共70顆
int pin9 = 9;               //這是控制光鍵伸縮的pin
int flag = 0;
int var = 0;                //pin9的狀態
int t = 1;
int T = 80;                 //每次多點(或熄滅)一組LED所需要的周期
int i = 0;
int j = 0;
void setup()
{
  for( int i = 0; i < 7; i++)
  {
    pinMode(pin[i], OUTPUT);
    digitalWrite(pin[i], HIGH);
  }
  pinMode(pin9, INPUT);
}
void loop()
{
  while(true)
  {
  // flag 計數器
  var = digitalRead(pin9);
  if( var == 0 ) //若pin9為低電位,則光劍開始伸長
  {
    flag++;
    j++;
    if( flag > 6*T )   //等到全部點亮之後才會執行
    {
      flag = 6*T;
    }
  }    
  if( var != 0) //若pin9為高電位,則光劍開始縮短
  {
    flag--;
    j--;
    if( flag < 0)
    {
      flag = 0;
      j=0;
      i=0;
      var = digitalRead(pin9);
      for( int i = 0; i < 7; i++)
      {  
        digitalWrite(pin[i], HIGH);
      }
    }
  }
 
  i = int(flag/T+1);
  if( var == 0 && j > i-1)
  {
    j = 0;
  }
  if( var != 0 && j < 0 )
  {
    j = i - 1;
  }
    // 以下的意思是1100000 -> 0110000 -> 0011000 -> 0001100...循環
    digitalWrite( pin[( j ) % i], HIGH );
    digitalWrite( pin[(j+1) % i], HIGH );
    digitalWrite( pin[(j+2) % i], HIGH );
    digitalWrite( pin[(j+3) % i], HIGH );
    digitalWrite( pin[(j+4) % i], HIGH );
    digitalWrite( pin[(j+5) % i], LOW  );
    digitalWrite( pin[(j+6) % i], LOW  );
    if( var != 0 && flag%T == 0) //i = int(flag/T+1);
    {
      digitalWrite(pin[i-1],HIGH);
    }
 
  delay(t);
  }
}
/*
這個計畫的LED每組10顆
因此在電壓5V的情況下
必須供應電流400mA以上
這個程式才能正常運作
*/

蘇兄 發表在 痞客邦 留言(0) 人氣()

1 2
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。