最近在玩的玩具

電子技術討論區,由版主群共同維運。

版主: bbsendermichael Chen3124

GALAXY
正式會員
文章: 152
註冊時間: 週六 4月 22, 2006 8:44 pm

最近在玩的玩具

文章GALAXY » 週六 3月 30, 2013 4:23 am

花了約三個月的時間搞出來的...
用 Arduino 搞出來的最多可以測量 6個電壓 的電壓表,6 CH都共地
(目前只能量 0~5V)

離開寫程式太久了...都還給老師了。
這個電壓表只要再加個分壓電阻,程式再改一下就可以測量 5V以上的電壓。
或搭配電流模組亦可測量電流。
每一CH的解析度 只有 10 bit 不是很高,但足夠一般的用途了。
圖檔

老和尚
正式會員
文章: 173
註冊時間: 週二 2月 09, 2010 9:13 am
來自: 深山一隅

Re: 最近在玩的玩具

文章老和尚 » 週六 3月 30, 2013 10:27 am

GALAXY 寫:花了約三個月的時間搞出來的...
用 Arduino 搞出來的最多可以測量 6個電壓 的電壓表,6 CH都共地
(目前只能量 0~5V)

離開寫程式太久了...都還給老師了。
這個電壓表只要再加個分壓電阻,程式再改一下就可以測量 5V以上的電壓。
或搭配電流模組亦可測量電流。
每一CH的解析度 只有 10 bit 不是很高,但足夠一般的用途了。
圖檔

江山代有才人出
阿彌陀佛
:-D :-D :-D
:roll: :roll: :roll:

GALAXY
正式會員
文章: 152
註冊時間: 週六 4月 22, 2006 8:44 pm

文章GALAXY » 週六 3月 30, 2013 10:55 pm

小弟不才,資質駑鈍,承蒙老大師看得起。

Arduino是個開放性的"電子積木",去"古狗"大神那古一下就知道了。
這是一個很容易上手的東西,玩它的門檻不高,花點時間就會了。
要是會 C++ 的人更好...因為它就是 C++ 再衍生出來的東西 :D

在古狗大神那兒可以找到很多用 Arduino 的作品(運氣好還可以找到完整的程式碼)
小弟打算用這來做個實驗電源供應器的電壓電流表(雙電源),後級的VU表,遙控音量,遙控輸入選擇...
慢慢來.... :eek:

wunshion
正式會員
文章: 366
註冊時間: 週四 3月 31, 2005 9:11 am
來自: TAIPEI

文章wunshion » 週日 3月 31, 2013 11:41 am

good job!!
請教GALAXY兄, 能將Arduino實驗的控制機制寫入一般的EPROM如8051 or 2051, 然後單由EPROM控制所有功能嗎?不太了解Arduino故有此一問

EvilHunter
正式會員
文章: 165
註冊時間: 週五 9月 01, 2006 1:39 am

文章EvilHunter » 週日 3月 31, 2013 1:27 pm

Arduino好處是不用碰低接的組合語言
另外TI有個更平價的LaunchPad系列也可以玩玩
http://hifiduino.wordpress.com/
這站的站主把Arduino用在DAC控制上

add
正式會員
文章: 66
註冊時間: 週三 6月 16, 2010 11:03 pm

文章add » 週日 3月 31, 2013 9:15 pm


GALAXY
正式會員
文章: 152
註冊時間: 週六 4月 22, 2006 8:44 pm

文章GALAXY » 週日 3月 31, 2013 11:22 pm

回 wunshion 兄我當初想的也是跟你一樣,想再重玩 8051 的,後來老闆大力推薦...
Arduino 的...才選擇它。
51的麻煩及不方便,玩過的人都知道。燒可能要一塊板子,執行又要另一塊板子,IC
拔來拔去的...2716~27xxx,早期還要準備紫外線燈的...

現在Arduino通通都在這塊版子上解決。容量有多大?好像有32K吧?偶不是很清
楚。它有很多型號...2560的有256k,其實 32k 足夠一般使用了。
而且用 usb 就可在電腦上燒錄,執行及監示。

就像 EvilHunter 兄說的一樣,玩Arduino摸不到組合語言。8051是 C , 組合
都摸得到。
而且Arduino的資料庫,函式庫 很好找,甚至 Arduino官網還有得下載。
51家族的可能還要自己建立...很辛苦。

門檻真的不高,花點時間學習一下。不必精通C++,只要看得懂把別人公開的程式
碼改一改就可以是你的作品了。
偶的這個 6CH 的電壓表也是改別人的程式碼(見笑了)...

以下是偶這鍋電壓表的程式碼,還求高手幫偶簡化,感謝您
(因為偶使用的這塊是圖型LCD,所以程式會複雜一些)

//端口定義
int LCD_RST=6;
int LCD_SCE=7;
int LCD_DC=5;
int SDIN=4;
int SCLK=3;
//****************************定義ASCII字號**********************//
/**********************************
6 x 8 font
1 pixel space at left and bottom
index = ASCII - 32
***********************************/
const unsigned char font6x8[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
};
static const byte hanzi12x16[][24]={
};

/************************LCD初始化涵數********************************/
void LCD_init(void)
{
//先設置為輸出
pinMode(SCLK,OUTPUT);
pinMode(SDIN,OUTPUT);
pinMode(LCD_DC,OUTPUT);
pinMode(LCD_SCE,OUTPUT);
pinMode(LCD_RST,OUTPUT);

//產生一個讓LCD復位的低電平脈衝
digitalWrite( LCD_RST, LOW);

delayMicroseconds(1);
digitalWrite( LCD_RST, HIGH);

//關閉LCD
digitalWrite( LCD_SCE, LOW);
delayMicroseconds(1);

//使能LCD
digitalWrite( LCD_SCE, HIGH); //LCD_CE = 1;
delayMicroseconds(1);
LCD_write_byte(0x21, 0); // 使用擴展命令設置LCD模式
LCD_write_byte(0xc8, 0); // 設置偏置電壓
LCD_write_byte(0x06, 0); // ?度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 設定顯示模式,正常顯示

//關閉LCD
digitalWrite( LCD_SCE, LOW); //LCD_CE = 0;
}
/************************LCD清屏涵數*******************************/
void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
{
LCD_write_byte(0, 1);
}
}
/*************************設置字符位置涵數**************************/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*************************ASCII字符顯示涵數*************************/
void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
{
LCD_write_byte(font6x8[c][line], 1);
}
}
/*******************************************************************/
/*-------------------------------------------------
LCD_write_english_String : 英文字符串顯示涵數
輸入參數:*s :英文字符串指針;
X、Y : 顯示字符串的位置,x 0-83 ,y 0-5
--------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
/******************************************************************/
/*---------------------------------------------
LCD_write_byte : 寫數據到LCD
輸入參數:data :寫入的數據;
command :寫數據/命令選擇;
---------------------------------------------*/
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
digitalWrite( LCD_SCE, LOW); // 使能LCD_CE = 0
if (command == 0)
{
digitalWrite( LCD_DC, LOW);// 傳送命令 LCD_DC = 0;
}
else
{
digitalWrite( LCD_DC, HIGH);// 傳送數據LCD_DC = 1;
}

for(i=0;i<8;i++)
{
if(dat&0x80)
{
digitalWrite( SDIN, HIGH);//SDIN = 1;
}
else
{
digitalWrite( SDIN, LOW);//SDIN = 0;
}
digitalWrite( SCLK, LOW);//SCLK = 0;
dat = dat << 1;
digitalWrite( SCLK, HIGH);//SCLK = 1;
}
digitalWrite( LCD_SCE, HIGH);//LCD_CE = 1;

}
/******************************************************************/
/*---------------------------------------------
void LCD_write_hanzi : 漢字顯示子涵數
輸入參數:row :寫入漢字列 page :寫入漢字行 row :寫入漢字 ;
---------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char dd) //row:列 page:頁 dd:字符
{
unsigned char i;
LCD_set_XY(row*8, page);// 列,頁
for(i=0; i<12;i++)
{
LCD_write_byte(hanzi12x16[dd][i],1);
}

LCD_set_XY(row*8, page+1);// 列,頁
for(i=12; i<24;i++)
{
LCD_write_byte(hanzi12x16[dd][i],1);
}
}

void setup()
{
LCD_init();//初始化液晶
LCD_clear();
delay(10) ;
Serial.begin(9600);
}
void loop()
{
int VAL0;
int ge0,shi0,xiao01,xiao02;
int distance0=analogRead(A0);//
VAL0=distance0*(5.0/1023.0*100.0);
shi0=VAL0%10000/1000;
ge0=VAL0%1000/100;
xiao01=VAL0%100/10;
xiao02=VAL0%10;
Serial.println(VAL0);

LCD_write_english_string(71,0,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,0); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi0); //顯示十位數
LCD_write_char( 0x30+ge0); //顯示個位數
LCD_write_english_string(53,0,".");
LCD_write_char( 0x30+xiao01); //顯示小數點後一位數
LCD_write_char( 0x30+xiao02); //顯示小數點後二位數
LCD_write_english_string(0,0,"A0:");
//-------------------------------------------------------------
int VAL1;
int ge1,shi1,xiao11,xiao12;
int distance1=analogRead(A1);//
VAL1=distance1*(5.0/1023.0*100.0);
shi1=VAL1%10000/1000;
ge1=VAL1%1000/100;
xiao11=VAL1%100/10;
xiao12=VAL1%10;
Serial.println(VAL1);

LCD_write_english_string(71,1,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,1); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi1); //顯示十位數
LCD_write_char( 0x30+ge1); //顯示個位數
LCD_write_english_string(53,1,".");
LCD_write_char( 0x30+xiao11); //顯示小數點後一位數
LCD_write_char( 0x30+xiao12); //顯示小數點後二位數
LCD_write_english_string(0,1,"A1:");
//--------------------------------------------------------------
int VAL2;
int ge2,shi2,xiao21,xiao22;
int distance2=analogRead(A2);//
VAL2=distance2*(5.0/1023.0*100.0);
shi2=VAL2%10000/1000;
ge2=VAL2%1000/100;
xiao21=VAL2%100/10;
xiao22=VAL2%10;
Serial.println(VAL2);

LCD_write_english_string(71,2,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,2); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi2); //顯示十位數
LCD_write_char( 0x30+ge2); //顯示個位數
LCD_write_english_string(53,2,".");
LCD_write_char( 0x30+xiao21); //顯示小數點後一位數
LCD_write_char( 0x30+xiao22); //顯示小數點後二位數
LCD_write_english_string(0,2,"A2:");
//-------------------------------------------------------------
int VAL3;
int ge3,shi3,xiao31,xiao32;
int distance3=analogRead(A3);//
VAL3=distance3*(5.0/1023.0*100.0);
shi3=VAL3%10000/1000;
ge3=VAL3%1000/100;
xiao31=VAL3%100/10;
xiao32=VAL3%10;
Serial.println(VAL3);

LCD_write_english_string(71,3,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,3); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi3); //顯示十位數
LCD_write_char( 0x30+ge3); //顯示個位數
LCD_write_english_string(53,3,".");
LCD_write_char( 0x30+xiao31); //顯示小數點後一位數
LCD_write_char( 0x30+xiao32); //顯示小數點後二位數
LCD_write_english_string(0,3,"A3:");
//-------------------------------------------------------------
int VAL4;
int ge4,shi4,xiao41,xiao42;
int distance4=analogRead(A4);//
VAL4=distance4*(5.0/1023.0*100.0);
shi4=VAL4%10000/1000;
ge4=VAL4%1000/100;
xiao41=VAL4%100/10;
xiao42=VAL4%10;
Serial.println(VAL4);

LCD_write_english_string(71,4,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,4); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi4); //顯示十位數
LCD_write_char( 0x30+ge4); //顯示個位數
LCD_write_english_string(53,4,".");
LCD_write_char( 0x30+xiao41); //顯示小數點後一位數
LCD_write_char( 0x30+xiao42); //顯示小數點後二位數
LCD_write_english_string(0,4,"A4:");
//-------------------------------------------------------------
int VAL5;
int ge5,shi5,xiao51,xiao52;
int distance5=analogRead(A5);//
VAL5=distance5*(5.0/1023.0*100.0);
shi5=VAL5%10000/1000;
ge5=VAL5%1000/100;
xiao51=VAL5%100/10;
xiao52=VAL5%10;
Serial.println(VAL5);

LCD_write_english_string(71,5,"V"); // 格式為 點,行 "秀的字"
LCD_set_XY(41,5); // "0"字秀在第三行,1的話秀在第二行
LCD_write_char( 0x30+shi5); //顯示十位數
LCD_write_char( 0x30+ge5); //顯示個位數
LCD_write_english_string(53,5,".");
LCD_write_char( 0x30+xiao51); //顯示小數點後一位數
LCD_write_char( 0x30+xiao52); //顯示小數點後二位數
LCD_write_english_string(0,5,"A5:");
delay(100) ;
}

wunshion
正式會員
文章: 366
註冊時間: 週四 3月 31, 2005 9:11 am
來自: TAIPEI

文章wunshion » 週一 4月 01, 2013 12:30 am

讚!!已經上網訂購一片Arduino UNO板了,收到後好好研究一番, 感謝提供資訊 :)

GALAXY
正式會員
文章: 152
註冊時間: 週六 4月 22, 2006 8:44 pm

文章GALAXY » 週四 4月 18, 2013 4:59 pm

圖檔

圖檔

超音波測距

GALAXY
正式會員
文章: 152
註冊時間: 週六 4月 22, 2006 8:44 pm

文章GALAXY » 週四 4月 18, 2013 6:57 pm

圖檔


回到「技術交流廳」

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客