2008年10月30日 星期四
89C51 與 RF 發射模組的問題
> 我想請問 如果我用 89C51 的 txd 的串列傳輸
> 送出一各 8 bit 的串列訊號 如後
> 給 RF 的發射模組 (TG-11 303Mhz) 發射出去
> 然後 在 接收模組上 接到 RS232 送給PC
> 然後 用 VB MSCOMM 顯示出來
> 但市不知道為什麼 接收的訊後 都一直不對 會亂跳
> 如果不接發射模組 8051 直接接到 RS232
> 一切正常 想請問 這是什麼原因...
> 我們老師不讓我們用 編解碼 IC HT12E
空中最好不要直接用 UART , 因為裡面的訊號中會有太長的定態, 也就是在資料中, 常常會有連
續的 0 , 或連續的 1.
在連續的期間, 只要有一丁點的干擾, 你的資料就完蛋了! 有空可以參考一下各種軟碟機的低階
讀寫原理, 若你要用那些的編碼最好!
有一個 PCM 的飛機遙控器, 就是用 APPLE ][ 軟碟的編碼方式...
若你要直接用 UART, 最好編碼後, 使之沒有連續的 1 (或 0) , 再用. 傳送資料時, 定態不要超
過三個 bit 的時間.
所以你可能要把一個 byte 的資料, 拆成兩 byte, 編碼插一些 bit 後, 再來送. 對方接到後, 再
組合回來.
同步碼, 前導碼....等等控制碼, 用資料編碼沒有用到的, 這樣接收的程式比較好寫.
當然, 無線通訊中, 由於失誤率遠大於有線, 故一定要有檢查碼 (有線幾乎都有在核對, 更何況是無
線呢? ) ; 以便讓收方要求重送, 還是丟棄.
另外 51 會干擾接收模組. 可的話, 用頻譜儀看一下在接收頻率附近的那幾根諧波, 有沒有很大根,
有沒有命中接收頻率.
注意 RF 模組的頻寬, 以便規化適合的鮑率.
~~~~~~
很精闢的見解,一針見血,佩服,這位仁兄所說得情形與敝人先行實驗的結果完全吻合,實為值得參考
的文章,好好研究個中道理,就會明白問題來源,編碼與通訊協定是重要的考慮與必要的措施..
Good luck....
--
Free Tech (Win32Asm, Electronics..)
http://freetech.hypermart.net/
Updated: May-9, 2001 / 20:15
以前的 post (2)
=========================
Re:使用無線模組(類似tg11)與rs232連接,做無線單向的資料傳輸遇到的問題
>
>TG11 模組..基本上是用來傳送簡單的命令而已..類似機車的遙控發動器...
>加上編解碼 IC,可以傳送的距離非常遠..我有測試過..可達到 50 幾公尺..再遠沒測過了..
>
>至於你說的這個架構..
>基本上我也是有嘗試過...
>只不過我的架構是...
>PC->RS-232->HIN232(電壓準位轉換)->無線發射模組 ~~ 無線接收模組->8051 的 RS-232 埠
>但是..可以傳送的距離很短..二~三公尺左右..
>
>因此..基本上你的架構應該是可行的..
>只是有些地方可能你可以嘗試一下...
>我傳送資料時..大概每秒要傳送 30 幾筆左右...每筆大約 10Byte 左右..
>8051 才能穩定的接收到資料...
>我的 Baud Rate = 4800 bps...8N1...
>給你參考...希望對你有幫助...^^
>
>另外..你可以到 Google 用 "RWS-434" 關鍵字應該可以查到很多資料..
>還有..元智大學也有相關的文件..
>http://designer.mech.yzu.edu.tw/article/articles/technical/(2001-08-30)
>無線電收發模組電路製作介紹.htm
>
>
你可能要嘗試著將傳送資料的"頻率"提高...
例如..每秒傳送字串"123456789"...30-40次...
也就是說..每隔 30mS 左右..就將字串"123456789"傳送過去...
這樣可以提高資料傳送時的穩定度...
另外..二個模組不要擺太遠..一開始最好離近一點...模組需要加上天線..會比較好..
嗯..是的..接收端會一直接收到雜訊..若要排除接收到雜訊..則可以自定接收的格式...
例如..若你要傳送"ABC"這三個字元過去...則你的格式可能可以類似寫成這樣子...
$ABCk@
$-->表示前導符號...
ABC-->表示欲傳送的資料..
k-->表示檢查碼..Check Sum
@-->表示結束符號...
程式可以寫成...
當接收到的字元..是 '$' 時..
則開始接收資料..並同時儲入 Buffer..
一直接收到..結束字元 '@' 出現...或資料長度大於某個值..才結束接收..
當字串接收完成後, 再比對 Check Sum 與傳送的資料是否符合..
若符合..則表示資料接收正確...
給你參考..希望有幫助..^^
呵呵~~~看來有人碰到跟我一樣的問題喔~~我之前有做一個題目,其中也是需要無線傳輸,
於是我用的架構跟你們討論的一樣(因為這是最方便的),但是我發現,這需要將傳送的包率
達到 115200 才能夠比較容易接收到,而且為了增加傳輸的可信度,使用了
handshake+boardbast+packet 的 Protocol,因為我這是一個 server 對很多的 client 做控制,
但都是使用一樣的頻率,所以我是用 TDM 方式來做,但還是不穩,有時不到 1 秒就可以控制
有時要等一分鐘?!@@a....這種通訊系統實在是太爛了....當下我也找不出方法可以解決就畢業了....
但是現在我知道問題所在了
原因是 "0","1" 分別要用不同的狀態來表示,不能直接把 "O" 當成電位 0V 送給模組,
這樣會變成接收段無法判斷現在是什麼狀態,這麼說好了,如果是送 1 出來的話還沒什麼錯誤,
但 RS232 是 狀態0 就是 0電位,這時接收端就會接收到雜訊,運氣好的話若雜訊是在 TTL 的
0準位以下,就收到 0,但雜訊一個過大,就變成 1 了,那這時就會出錯
所以很不幸的...不能直接送 RS232 訊號給模組....所以別偷懶了~~~自己寫個 protocol 來傳吧,
我建議可以遵循紅外線的傳送方式來送,因為 PT2262 這個無線遙控器 IC 就是用這樣的方式來傳,
大家可以去 GOOGLE 找這個 SPEC.裡面有 PROTOCOL 的詳細解說或是使用 Manchester 編碼
也是可以的~~不管是用什麼方法,反正原則就是千萬不要用電位 0 來代表有意義的資料
送到無線模組~~說完了>_<||
2008年10月29日 星期三
Arduino 連接 LCD1602
Arduino我已经接触一段时间了,由于工作原因,不能天天玩这个,所以只能隔三岔五的搞点实验,现在把一些心得给大家分享一下。
今天玩的是字符液晶1602,有玩过1602字符液晶的朋友都知道,这个液晶分4总线和8总线2种驱动方式(关于该液晶的详细资料,大家
可以自己搜索,这里就不做详细说明了)。我们用单片机驱动1602液晶,使用并口操作很容易就驱动起来了,但使用
Arduino板驱动1602液晶,还真有点费劲,因为他只能位操作。根据官方网站提供的例程,很容易看出他们使用的是最常用的8总线驱动方式,然而他巧
妙的使用for循环语句完成了位操作的赋值。我们来看看官方的工程代码:
int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚
int Enable = 2;
void LcdCommandWrite(int value) {
// poll all the pins
int i = 0;
for (i=DB[0]; i <= DI; i++) //总线赋值
{
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1);
// send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1); // pause 1 ms according to datasheet
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void LcdDataWrite(int value) {
// poll all the pins
int i = 0;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[7]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1);
// send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void setup (void) {
int i = 0;
for (i=Enable; i <= DI; i++) {
pinMode(i,OUTPUT);
}
delay(100);
// initiatize lcd after a short pause
// needed by the LCDs controller
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
delay(64);
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
delay(50);
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
delay(20);
LcdCommandWrite(0x06); // entry mode set:
// increment automatically, no display shift
delay(20);
LcdCommandWrite(0x0E); // display control:
// turn display on, cursor on, no blinking
delay(20);
LcdCommandWrite(0x01); // clear display, set cursor position to zero
delay(100);
LcdCommandWrite(0x80); // display control:
// turn display on, cursor on, no blinking
delay(20);
}
void loop (void) {
LcdCommandWrite(0x02); // set cursor position to zero
delay(10);
// Write the welcome message
LcdDataWrite('H');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
LcdDataWrite(' ');
LcdDataWrite('C');
LcdDataWrite('a');
LcdDataWrite('r');
LcdDataWrite('a');
LcdDataWrite('c');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
delay(500);
}
实验器材:Arduino DM 一个,USB电缆一根,LCD1602一个,单芯杜邦线若干。
根据例程定义接线图如下:
大家需要注意的是,液晶根据不同的颜色不同的型号,对比度(VEE)调节电压也不同,一般都需要接个电位器进行调节,本人使用的是灰膜液晶,VEE直接接到地即可。
例程编译后,下载进Arduino,显示居然不正常,如图:
一般这种液晶上电或没有正常初始化就会出现一排黑块,但我仔细检查了程序和电路连线,也没有看出什么问题,难道液晶坏了?我又把液晶拆到我的51实验板上验证是好的,我开始怀疑是对比度调节的问题,于是把液晶拿起来一看,果然是对比度不对。
斜着看,就能看见“Hola
Caracila”的字样,也就是我们实验需要显示的内容。这款灰膜液晶我使用很多次,对比度调节端都是直接接地,没有任何问题,怎么用这个程序就出现这
样的问题,于是我又找到官方网站仔细探头究竟,终于被我发现问题的所在,官方网站使用的是2001的液晶(好象是这个型号),是单排显示的一排显示20个
字符, 因此这个问题就出在液晶的功能初始化设置上了,我开始没有注意,所以就直接套用程序了。
根据我们使用的液晶更改功能初始化设置,指令集如下表:
根据指令6,将官方提供的代码初始化部分:
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
delay(64);
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
delay(50);
LcdCommandWrite(0x30); // set:
// 8-bit interface, 1 display lines, 5x7 font
更改为8总线、双行显示、5x7:
LcdCommandWrite(0x38); // set:
// 8-bit interface, 2 display lines, 5x7 font
delay(64);
LcdCommandWrite(0x38); // set:
// 8-bit interface, 2 display lines, 5x7 font
delay(50);
LcdCommandWrite(0x38); // set:
// 8-bit interface, 2 display lines, 5x7 font
更改后编译、下载,显示结果如下:
是不是能够很清楚的看见“Hola Caracila”的字样了。
Arduino DM的数字端口只有13个,那么LCD1602就占用了10个,浪费了不少资源,对我们以后的电路扩展带来了极大的不便。于是我就可以使用该液晶的4总线驱动方式,可以节省3个数字端口出来作其他扩展。本人编写的工程代码如下:
/********************************************************************/
int LCD1602_RS=12;
int LCD1602_RW=11;
int LCD1602_EN=10;
int DB[] = { 6, 7, 8, 9};
char str1[]="Welcome to";
char str2[]="www.DFRobot.cn";
/********************************************************************/
/********************************************************************/
void LCD_Command_Write(int command)
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=command & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(command & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_Data_Write(int dat)
{
int i=0,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=dat & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(dat & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_SET_XY( int x, int y )
{
int address;
if (y ==0) address = 0x80 + x;
else address = 0xC0 + x;
LCD_Command_Write(address);
}
/********************************************************************/
void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
}
/********************************************************************/
void LCD_Write_String(int X,int Y,char *s)
{
LCD_SET_XY( X, Y ); //设置地址
while (*s) //写字符串
{
LCD_Data_Write(*s);
s ++;
}
}
/********************************************************************/
void setup (void)
{
int i = 0;
for (i=6; i <= 12; i++)
{
pinMode(i,OUTPUT);
}
delay(100);
LCD_Command_Write(0x28);//4线 2行 5x7
delay(50);
LCD_Command_Write(0x06);
delay(50);
LCD_Command_Write(0x0c);
delay(50);
LCD_Command_Write(0x80);
delay(50);
LCD_Command_Write(0x01);
delay(50);
}
/********************************************************************/
void loop (void)
{
LCD_Command_Write(0x02);
delay(50);
LCD_Write_String(3,0,str1);//第1行,第4个地址起
delay(50);
LCD_Write_String(1,1,str2);//第2行,第2个地址起
while(1);
}
根据程序定义接线图如下:
编译后,下载进Arduino,显示如图:
这个代码容易移植,以后需要用到显示的地方,都可以直接引用。
找到了Arduino语言关于字符液晶4总线的库函数,使用该库函数程序就变的相当简洁了。函数例程如下:
#i nclude <LCD4Bit.h>
LCD4Bit lcd = LCD4Bit(1); //传递参数1和2,表示选择1线和2线字符液晶。
lcd.clear();//清屏
delay(1000);//延时
lcd.printIn("arduino");//显示字符串
lcd.cursorTo(2, 0); //line=2, x=0
lcd.leftScroll(20, 50);//將LCD上现有的文字以50ms的速度向左移动20个字符位
注意:若使用LCD4Bit.h的话,RW需要接地.
下载“LCD4Bit.h”
基于神经元的两轮自平衡机器人
前言:
2006年就想做一个2轮自平衡小车,但是一直事情比较多,也没找到合适的元件.一直拖到现在. 这当中其实也试了不少其它的硬件,但是都不是很理想. 现在终于把硬件配齐了. 当然花费也不少.
现在的DIYER比我们当时可是幸福多了,不但可选择的产品多了很多, 价格也是每年都在跌. 当初2个电机就花了600多,还不带编码器和驱动器, 而控制板也不便宜, 也要300多,更要紧是用起来不方便. 不像现在的Arduino板子, 样例超多。下面买的这些传感器和控制器都有相关的代码,拿来就能用。
这个制作的就是想要试试两轮的自平衡控制系统, 在硬件上和其它的双轮自平衡小车没有太大区别,唯一的区别是在其控制器上. 主要是想看看用神经元网络进行自学习平衡,会有什么样的效果. 因为是实验性质,所以最后的效果如何还不能确定,只是原理上是行得通的.
硬件部分
先看看硬件的 零件清单:
1) Devantech 驱动系统
2) 5自由度传感器,3轴加速度,2轴陀螺仪
3) Arduino控制板
4) 电池, 2个7.2V 3900mA串联
5) CMPS03 电子罗盘
6) 无线传输模块APC220
终于让Arduino和MD23通信了 i2c
查阅了无数的论坛, 终于发现原来Arduino的I2C通信无需所谓的上拉电阻。可以直接连接到i2C设备,但是唯一的前提就是,需要共地,或者共电源。
再将Arduino的GND和MD23的输出GND连接后,MD23就乖乖的听Arduino的指挥。要你往前转,你就不敢往后。哈哈!
关于URM37系列超声波使用中的问题解答
http://bbs.roboticfan.com/topic.aspx?topicid=5007
一.URM37V1.0-1.1
二.URM37V3.0-3.2
Q:请问怎样设置模式2的距离比较值,我打算的比较值是15CM?
A: 模块EEPROM地址00写0x0F;(0x0F是15cm距离的10进制转16进制的低8位)
模块EEPROM地址01写0x00;(0x00是15cm距离的10进制转16进制的高8位)
模块EEPROM地址02写0xaa;(0xaa是模块模式2自动测量模式的命令)Q:按使用手册的图接好后,V3.2伴侣无返回数据显示,只看到硬件上绿灯在亮,这是怎么回事?
A:1.检查电源是否接好,模块上绿灯亮表示电源正常. 2.检查数据线是否接正确(模块8脚到串口母头3脚,模块9脚到串口母头2脚,模块2脚到串口母头5脚),线是否导通.
3.检查软件串口选择是否正确,串口是否打开.
1)我想采用第一串口被动模式测距,如何接收返回距离?有具体的汇编程序参考一下么?
答:返回指令为4个字节的数据,在十六进制下,为 0x22 0x11 0x12 0x45。 这里0x22表示返回距离读数,0x11代表距离的高位,0x12代表距离的低位,0x45是校验位,其值等于前面数据的和=22 11 12=45,具体表示就是0x45。
2)另外那个角度问题,我没有买那个驼机,我就想让它直接测前面的距离,角度应该怎样写呢?
答:角度数据可以任意写。
3)URM37 V3 超声波传感器使用第二功能要怎么配置?
答: 需要写入比较距离值
串口发送
0x44 0x00 低距离 SUM
0x44 0x01 高距离 SUM
0x44 0x02 0xaa 0xf0
如果不用开关模式,就直接写0x44 0x02 0xaa 0xf0
4).我想设置为“PWM被动控制模式”,命令为0x44+0x22+0xaa+SUM,执 行命令结果也为“有效”!使用的是rm37 V3.2伴侣! 当我执行读指令0x33+0x22+0x00+SUM时,返回值为0x33+0x22+0x00+SUM,设置自动模式,然后验证也一样!问题:为啥我没 有写进去?是不是urm 37 V3.2不支持这个功能? 串口是打开的,电路也检查了. 谢谢,请指教!
答:您需要写入 0x44 +0x02+0xBB+SUM
Arduino扩展板使用之舵机篇
路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动
无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。
舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,请大家注意。
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。
下面我们用Arduino控制配合扩展板控制3个不同牌子的舵机。首先了解一下扩展板的一些特性。
本实验需要扩展板一个,舵机3只。由于只是做演示用,舵机5v电源就暂时使用Arduino上的,但不可长时间使用,因为多个舵机转动时电流比较
大,Arduino上的电源芯片可能会因过热而保护甚至损坏,电源选择跳线需要接到外部供电,不可使用USB供电。
Arduino官方网站给我们提供了一个很好的舵机调用函数库(舵机函数库下载地址),可以让Arduino任意IO口控制舵机,下列代码使用Arduino的编译环境中的串口监视器发送数据来控制舵机旋转角度。
实验代码如下:
#i nclude <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
void setup()
{
servo1.attach(8);//定义舵机控制口
servo1.setMaximumPulse(2200);//定义旋转的时间
servo2.attach(9);
servo2.setMaximumPulse(2200);
servo3.attach(10);
servo3.setMaximumPulse(2200);
Serial.begin(19200);//设置波特率
Serial.print("Ready");
}
void loop()
{
static int v = 0;
if ( Serial.available()) {
char ch = Serial.read();//读取串口数据
switch(ch) {
case '0'...'9':
v = v * 10 + ch - '0';//字符换算成10进制
break;
case 'a'://如果数据后带a,则表示是servo1的数据,比如串口发送85a
servo1.write(v);
v = 0;
break;
case 'b'://如果数据后带b,则表示是servo2的数据,比如串口发送90b
servo2.write(v);
v = 0;
break;
case 'c'://如果数据后带c ,则表示是servo3的数据,比如串口发送180c
servo3.write(v);
v = 0;
break;
}
}
Servo::refresh();//刷新
}
本实验代码在Arduino 0011版编译环境中编译通过,在Arduino 0012版编译环境中没有编译通过,不知何故?
Arduino&GP2D12红外线测距传感器
最近忙生活琐事,很少搞这些小东东,今天闲了一下就发表一个Arduino控制GP2D12的小实例,仅供大家参考!
器材:Arduino开发板,GP2D12,1602字符液晶,连接线若干。
Arduino开发板和1602字符液晶我就不多介绍了,前面都提到过。
GP2D12是日本SHARP公司生产的红外距离传感器,价格便宜,测距效果还不错,主要用于模型或机器人制作。
技术规格如下:
探测距离:10-80cm
工作电压:4-5.5V
标准电流消耗:33-50 mA
输出量:模拟量输出,输出电压和探测距离成比例
从曲线图中我们可以看出,输出电压并非是线性的,所以这个测距也就只能测个大概,如果要精度高的话就需要做非线性校正,这里我们就不讨论这个问题了。
实验原理:
GP2D12根据距离的远近输出相应的电压,经Arduino开发板0号模拟口输入,转换成数字量,根据公式计算得到需要显示的数据。
实验原理图:
实验实物图:
没有障碍物,显示范围超出。
有障碍物时显示测量距离。
经实验,需要在GP2D12的电源端加个10UF以上的电解电容,稳定供电电压,以保证输出模拟电压更稳定。
实验代码:
/********************************************************************/
int GP2D12=0;
int ledpin = 13;
int LCD1602_RS=12;
int LCD1602_RW=11;
int LCD1602_EN=10;
int DB[] = {6, 7, 8, 9};
char str1[]="www.DFRobot.cn";
char str2[]="Renge:00cm";
char str3[]="Renge Over";
/********************************************************************/
/********************************************************************/
void LCD_Command_Write(int command)
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=command & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(command & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_Data_Write(int dat)
{
int i=0,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=dat & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(dat & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_SET_XY( int x, int y )
{
int address;
if (y ==0) address = 0x80 + x;
else address = 0xC0 + x;
LCD_Command_Write(address);
}
/********************************************************************/
void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
}
/********************************************************************/
void LCD_Write_String(int x,int y,char *s)
{
LCD_SET_XY( x, y ); //设置地址
while (*s) //写字符串
{
LCD_Data_Write(*s);
s ++;
}
}
/********************************************************************/
void setup (void)
{
int i = 0;
for (i=6; i <= 13; i++)
{
pinMode(i,OUTPUT);
}
LCD_Command_Write(0x28);//4线 2行 2x7
delay(50);
LCD_Command_Write(0x06);
delay(50);
LCD_Command_Write(0x0c);
delay(50);
LCD_Command_Write(0x80);
delay(50);
LCD_Command_Write(0x01);
}
/********************************************************************/
void loop (void)
{
float temp;
int val;
char i,a,b;
LCD_Command_Write(0x02);
delay(50);
LCD_Write_String(1,0,str1);
delay(50);
LCD_Write_String(3,1,str2);
delay(50);
while(1)
{
val = analogRead(GP2D12);
temp=val/5.8;//改变被除数,可以减小一点误差。
val=95-temp;//由于GP2D12的输出电压与距离成反比,所以需要用一个常量相减,改变这个常量,可以减小一点误差。
if(val>80)
{
LCD_Write_String(3,1,str3);
}
else
{
LCD_Write_String(3,1,str2);
a=0x30+val/10;
b=0x30+val%10;
LCD_Write_Char(9,1,a);
LCD_Write_Char(10,1,b);
}
delay(500);
}
}
2008年10月28日 星期二
Arduino 連結超便宜ASK無線模組的 Library
http://www.open.com.au/mikem/arduino/VirtualWire.pdf
不使用 encoder HW 只使用MCU 的 RF Module Link
Running TX433 and RX433 RF modules with AVR microcontrollers
http://winavr.scienceprog.com/example-avr-projects/running-tx433-and-rx433-rf-modules-with-avr-microcontrollers.htmlWinAVR AVR-GCC Tutorial
2008年10月27日 星期一
Running TX433 and RX433 RF modules with AVR microcontrollers
RF Link between two Arduinos
http://dma.ucla.edu/senselab/node/389<br /><br />#include <softwareserial.h><br /><br />/* <br />Read a pushbutton and send a value<br />to another microcontroller. <br />*/<br /><br />#define rxPin 2<br />#define txPin 3<br />#define buttonPin 12<br />#define ledPin 13<br /><br />// set up a new serial connection for communicating with RF transmitter <br />// (this also frees up Arduino's built in serial port for PC communication)<br />SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);<br /><br />byte val = 0;<br />byte onState = 99;<br />byte offState = 98;<br /><br />void setup() {<br /> pinMode(buttonPin, INPUT); // declare pushbutton as input<br /> pinMode(ledPin, OUTPUT); // declare led as output<br /> rfSerial.begin(2400); // our RF Link is a 2400 baud model (make sure you check this!)<br /> // start by blinking high and then low so we can tell the setup routine has been completed<br /> digitalWrite(ledPin,HIGH);<br /> delay(1000);<br /> digitalWrite(ledPin,LOW);<br />}<br /><br />void loop(){<br /> val = digitalRead(buttonPin);<br /> if ( val == HIGH ) { // check if the input is HIGH (button pressed)<br /> rfSerial.print(onState, BYTE); // OK send it to the RF transmitter<br /> } else {<br /> rfSerial.print(offState, BYTE); // send a 0 through the transmitter<br /> }<br />}<br /></softwareserial.h></pre><p>
OK and here is the receiver code which goes on Arduino #2. Once again
I'm using the SoftwareSerial library, but this time it's necessary
because I need to use the usual Serial port to send data up the USB to
the computer. The loop is filled with a little extra code to avoid
sending the same byte over and over and over. A byte is only sent if it
is new (changes from "off" byte to "on" byte for instance and no data
would be sent again until it goes back "off").</p>
<pre>#include <softwareserial.h><br /><br />/* <br />Read from a RF Link receiver module<br />and get the data into a computer. <br />*/<br /><br />#define rxPin 2<br />#define txPin 3<br />#define ledPin 13<br /><br />// set up a new serial connection for communicating with RF receiver <br />// (this also frees up Arduino's built in serial port for PC communication)<br />SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);<br /><br />char prevChar = 0;<br /><br />void setup() {<br /> // set up the input and output pins<br /> pinMode(rxPin, INPUT); // set up pins for serial comm. with RF receiver<br /> pinMode(ledPin, OUTPUT);<br /> // initialize serial comm<br /> rfSerial.begin(2400); // begin serial connection with RF Link unit<br /> Serial.begin(2400); // begin serial communication over USB to the computer<br /> // blink LED on and then off just to let us know the setup routine is complete<br /> digitalWrite(ledPin,HIGH); // turn on LED<br /> delay(1000);<br /> digitalWrite(ledPin,LOW); // turn off LED<br />}<br /><br />void loop(){<br /> char someChar = '0'; <br /> someChar = rfSerial.read(); // read whatever the RF Link has to offer<br /> // print out the character: <br /> if (someChar!=prevChar) { // only print out new data (don't print 0 a billion times in a row)<br /> Serial.print(someChar, BYTE); // send data to computer<br /> prevChar=someChar; // store what we just read<br /> }<br />}<br /></softwareserial.h>
2008年10月26日 星期日
2008年10月22日 星期三
WinCE Web Server
新一篇: 制作在wince系统上的安装程序 | 旧一篇: EVC中如何添加库文件?
支持基本的功能,就是 Web Server ,而且还有 FTP Server
你可以在网络部分的服务器部分里找到,具体的你需要看PB的帮助!
另外,第三方的也有,不过你先把WinCE自带的Web Server 搞懂比较好!
下面,我简要下一下配置方法:
裁减操作系统时,你定位到以下路径:
Communication Services and Networking/Servers/Web Server (HTTPD)
注意,Web Server 底下还有 Active Server Pages (ASP) Support
编译,下载目标系统。
一般来说,WinCE启动后自动自动了 Web Server ,假如你的WinCE设备的IP地址为192.168.1.100
那么,你在PC上可以访问 http://192.168.1.100
如果成功,可以看到它默认的主页。
至于,停止、启动Web 服务,你可以用 services start httpd0:
停止服务:services stop httpd0:
查看当前服务状态(包括其它服务): services list
以上命令是在WinCE中的命令行中输入的,你在裁减时需要加载这个组件。
具体的你查PB帮助吧!
2008年10月20日 星期一
device and handhelds and microsoft windows ce
http://search.techrepublic.com.com/search/device+and+handhelds+and+microsoft+windows+ce.html
Enabling FILECTL ActiveX component on Mobile Devices
http://www.sandboxm.com/enabling-filectl-on-devices/
DllRegisterServer()
http://www.bokebb.com/dev/english/1951/posts/195130668.shtml
eMbedded Visual C++ 4.0
G6K4D-FX9P2-RMHJ9-WR4YV-3GF9B
2008年10月19日 星期日
2008年10月18日 星期六
2008年10月17日 星期五
URM V3.2 ultrasonic sensor to Arduino board
This article gives a sample how to interfacing URM V3.2 ultrasonic sensor to Arduino board. Of couse, our Roboduino works as well.
1) Change URM V3.2 Mode to PWM output
To connect URM V3.2 to Arduino type board, you have to change the URM V3.2 mode to PWM output. To do that, you need send 0x44, 0x02,0xbb, 0x01 to the sensor through serial connection. You can use URM helpmate V1.2 to do that.
http://www.yerobot.com/download/software/URMV3.2HelpMate.rar
All URM V3.2 shipped after 15th August 2008, the PWM function will be enabled before shipping.
2) Connect URM V3.2 to Arduino
Here is a connection diagram:
Attachment:
Roboduino-URM.jpg
Roboduino-URM.jpg [ 122.45 KiB | Viewed 250 times ]
V3.2 Arduino
Pin2 GND
Pin1 Pin12
Pin4 Pin11
Pin6 Pin10
Pin7 Pin9
Last edited by ricky on Sat Sep 13, 2008 4:31 pm, edited 7 times in total.
Top
Profile
ricky
Post subject: Re: Interfacing URM Ultrasonic Sensor to Arduino (Roboduino)
PostPosted: Tue Jul 29, 2008 10:27 pm
Offline
Joined: Sat Jul 12, 2008 3:50 pm
Posts: 17
Here is the Arduino code:
Code:
/* URM V3.2 Ultrasonic Sensor
*------------------
*
* Reads values from an ultrasonic sensor (5m sensor)
* and writes the values to the serialport.
* Help, please goto www.yerobot.com
* First written by Ricky on 2008 08 13
* Last modified by Crystal on 2008 09 27
*/
int ultraData = 11; // Ultrasonic data pin
int ultraTrigger = 10; // Ultrasonic trigger pin
int ultraEnable=9; //Ultrasonic enable pin
int ultraPower=12;//Ultrasonic power pin
int val = 0;
int ultraValue = 0;
int timecount = 0; // Echo counter
int ledPin = 13; // LED connected to digital pin 13
void setup() {
Serial.begin(9600); // Sets the baud rate to 9600
pinMode(ledPin, OUTPUT); // Sets the digital pin as output
pinMode(ultraPower, OUTPUT);
digitalWrite(ultraPower, HIGH); // Set to HIGH to provide 5V power
pinMode(ultraEnable, OUTPUT);
digitalWrite(ultraEnable, HIGH); // Set Enable Pin to HIGH
delay(200); //Give sensor some time to start up --Added By crystal from Singapo, Thanks Crystal.
}
void loop() {
ultraValue = 0;
digitalWrite(ledPin,LOW);
timecount = 0;
val = 0;
pinMode(ultraTrigger, OUTPUT); // Switch signalpin to output
/* Send low-high-low pulse to activate the trigger pulse of the sensor
* -------------------------------------------------------------------
*/
digitalWrite(ultraTrigger, HIGH); // Send low pulse
delayMicroseconds(500);
digitalWrite(ultraTrigger, LOW); // Send low pulse
delayMicroseconds(200);
digitalWrite(ultraTrigger, HIGH); // Send low pulse
delayMicroseconds(200);
/* Listening for echo pulse
* -------------------------------------------------------------------
*/
pinMode(ultraData, INPUT); // Switch signalpin to input
do // Loop until pin reads a high value
{
val = digitalRead(ultraData);
}while(val == HIGH);
do // Loop until pin reads a high value
{
val = digitalRead(ultraData);
timecount ++; // Count echo pulse time
delayMicroseconds(50);
}while(val == LOW);
/* Writing out values to the serial port
* -------------------------------------------------------------------
*/
ultraValue = timecount; // Append echo pulse time to ultraValue
Serial.println(ultraValue,DEC);
Serial.flush();
/* Lite up LED if any value is passed by the echo pulse
* -------------------------------------------------------------------
*/
if(ultraValue > 20){
digitalWrite(ledPin, HIGH);
}
/* Delay of program
* -------------------------------------------------------------------
*/
delay(50);
}
URM37V3.0超聲波模塊S51例程
2008年10月16日 星期四
Active Server Pages: Open, Read and Create files
http://www.asptutorial.info/learn/OpenReadCreate-files.html
Arduino RF Link
Arduino RF Link
I bought two RF links from SparkFun a while back (a 315Mhz and a 434Mhz).
A few nights ago, I actually hooked one of them up and successfully ran
a test program between two Arduinos. Here's the code for the receiver:
#define rxPin 2<br />#define txPin 3<br /><br />byte incomingByte = 0;<br /><br />SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);<br /><br />void setup() {<br /> pinMode(rxPin, INPUT);<br /> pinMode(txPin, OUTPUT);<br /> rfSerial.begin(2400);<br /> Serial.begin(2400);<br />}<br /><br />void loop() {<br /> incomingByte = rfSerial.read();<br /> Serial.println(incomingByte, DEC);<br /> incomingByte = 0;<br />}</pre>And for the transmitter:<pre>#define rxPin 2<br />#define txPin 3<br /><br />SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);<br />byte outgoingByte = 0;<br /><br />void setup() {<br /> pinMode(rxPin, INPUT);<br /> pinMode(txPin, OUTPUT);<br /> rfSerial.begin(2400);<br /> Serial.begin(2400);<br />}<br /><br />void loop() {<br /> Serial.println(outgoingByte, DEC);<br /> rfSerial.println(outgoingByte, BYTE);<br /> outgoingByte++;<br /> delay(10);<br />}Pretty
simple. It just sends the numbers 0-255 repeatedly and prints them out
to serial (use the serial monitor to watch the bytes fly by). The part
that threw me for awhile was that the receiver has two data pins. I
read somewhere
(*ahem* SparkFun KLP Walkthrough Tutorial) that only one of them was
useful (pin 2) and the other (pin 3) was optional and could be tied to
ground. After banging my head against the wall, I looked at the
receiver data sheet which clearly shows that the data pins should be
tied together! Once I corrected my wiring, it worked beautifully. So,
last but not least, a photo.
2008年10月15日 星期三
VOICEME 數位你的生活 (聲控 Robot)
VOICEME 數位你的生活 (聲控 Robot)
世界首富BillGates他那全數位化的豪宅是否曾令你心神嚮往?
從小時候到現在就一直希望能擁有一個全數位化的生活,當然,隨身的手機、PDA到數位相機是最基本配件,但生活中的大小事似乎全掌握在那好幾支的大小搖控器手上,雖然說有貴貴的萬用或數位搖控器可以選擇,但總覺得少了那麼一點帶有未來的感覺。
VoiceMe產品的誔生給了我們這些平民百姓一個簡單生活數位化的方式,透過聲控就可以輕鬆的操控您家中的各種數位化產品喔,打開電視,用說的,切到HBO也是用講的,開冷氣、關音響、調音量任何可以用搖控器控制的都可以交給VoiceMe自動化完成。
產品包裝,全英文的,可能做外銷的比較多吧。
VoiceMe是利用sensory的聲音辨識技術為核心,經小弟實機測試效果真的很不錯,手冊上寫的是利用一組觸發指令,但我拿到的卻要兩組,也許是一
組比較容易誤判吧,他的玩法相當的簡單,先錄兩組所謂的觸發指令(小弟是用R2及D2)再加上一個『指令』即可完成一組聲控的組合,系統提供同時30組的
指令可供使用,每一組指令最多可指定三個動作喔。
內附中文手冊,除了觸發指令兩組和說明書稍有出入之外,說明還算詳盡。
VoiceMe動作的指定是利用原有的搖控器對他進行紅外線訊號的發射,他會聰明且忠實的記錄下來,再加上全中文語音的引導,簡單設定輕鬆上手。
酷酷的飛碟圓盤造型相當具有質感,我買的是鐵灰色的不錯看,但黄色的好像也很讚。
三方向的紅外線發射器,再加上紅外線本來就有的反射原理,讓您的VoiceMe擺在哪都隨意。
重頭戲來了,VoiceMe提供的功能看似簡單但運用上卻相當的彈性、方便,比如說我希望一進房間一個指令就能幫我打開電視並切到Discovery,我
就可以說『 R2 D2 電視』,則VoiceMe則會依序傳送 打開電視電源、傳送1 9切到探索頻道(三個動作),然後再說 『R2 D2
冷氣』則冷氣就會自動開啟電源了,30個指令x3個動作也就是說您可以組合多達90組的動作喔,簡單的設定就實現了數位家庭的夢想,您還等什麼呢?全自動
的未來家居生活VoiceMe讓您也可以輕鬆的擁有。
產品手冊上寫的雖然是聲控搖控器,但我認為叫他是一台Robot也不為過,真實的R2D2買不到沒關係,但VoiceMe做為您的管家機器人也很不錯,有機會您一定要試試。
註:國產的優秀產品值得用力給他支持喔。
此文同步發表在 http://www.mobile01.com 前進數位家庭版
製造商在台灣也有賣VoiceMe呀! 我就是打電話去買的啊!
他們的網站是www.hotech.com.tw
各位大大可以參考看看
國產手機操縱者聯發科的秘密
國產手機操縱者聯發科的秘密
文 《環球企業家》記者 黃河
榮秀麗沒有壓抑住自己的火爆脾氣,拍著桌子沖對面四個聯發科技(MediaTek Inc,以下簡稱聯發科)的人大聲指責起來。
"為什麼不允許我們用展訊科技的產品,只能用你們聯發科的?"
"我們也只是'奉旨行事',請您諒解。"
此刻是2006年年中,北京天宇朗通通信設備有限責任公司和它的手機晶片方案提供夥伴聯發科剛開始合作兩周。天宇朗通的總經理榮秀麗無法接受臺灣合作夥伴的英代爾式作風——凡是其客戶,絕不允許採用競爭對手的產品。天宇朗通以前採用的是中國大陸的展訊和美國模擬器件公司(ADI)的手機晶片解決方案。
但榮很快便發現,自己對聯發科的一攬子手機晶片解決方案"上癮了"。有了聯發科的方案,天宇朗通最短在3個月就可以完成一台新機從設計、研發、生產到最後擺上櫃檯的全過程,而這一週期在國外成熟的手機廠商那裏,通常需要1年半。
聯發科承諾的質量可以與諾基亞比肩的說法,看起來也非誇張。天宇朗通的低端產品返修率現在約為4%,中高端為7%-8%。
即便問題來了,聯發科的服務回應堪稱迅速。在榮秀麗去聯發科的北京辦公室提出了一大堆要求和問題後,他以為對方起碼要在一兩天後,才能給回復。但就在她打車回單位的路上,就接到了數十個電話,開頭第一句話都是,"老闆剛才指示我,讓我馬上幫你解決問題"到榮下車後,所有問題基本都得到解決。
運氣看起來不能再好了。到了2006年8月份,天宇朗通的"天語/K-Touch"品牌手機的出貨量已達到80萬部——僅僅5個月前,這家公司才拿到手機生產牌照(此前它是一家手機分銷商)。到今年11月份,其在中國市場的份額達到了4%-5%,僅次於聯想移動的6.2%,在國產手機中排名第二。而其銷售額,據公開資料也已經超過12億元人民幣。如今,天宇朗通已成為聯發科在內地手機市場的最大合作夥伴。
曾令中外手機製造商撓頭不已的中國龐大的"黑手機"產業更是對聯發科感激涕零。一年前你在中國任何一個城市的電腦城裏逛一圈,就會發現若干外形似曾相識的"著名品牌"手機,比如"Song Ericsson"、"Motrola"或者"三新",還有一些你從未聽過的品牌,比如"野馬"、"東方龍"。它們中的絕大部分,都是聯發科的晶片套上了暢銷手機型號的外殼。黑手機一年前一度在中國市場佔據1/5的份額,其"過人之處"便是能在挑中市面上新品機型的外殼後,3個月內便實現銷售和回款。
業內流傳的說法是,中國內地有1億台左右的國產手機都採用了聯發科的晶片解決方案,而整個國產手機的出貨量今年也不過1.8億台。如果再考慮到所有在中國生產的手機(包括外資品牌)已經佔據了全世界產量的45%左右,聯發科的全球地位已經無庸置疑——根據聯發科自身的資料,其在手機晶片領域全球排名僅次於高通(Qualcomm)和德州儀器(TI),位元列第三。
投資者對此局面笑顏逐開:聯發科的銷售額過去五年來實現爆炸式增長,僅2007年的前三季度營收就達18億美元。聯發科在臺灣股市上的市值也飆升至6000億元新臺幣(約185億美元),股價從三年前不到250元新臺幣直漲到現在的650元,一度是臺灣股王。當地輿論則將聯發科盛讚為自鴻海以來新一代臺灣企業的代表,正在"終結美國大廠獨霸局面"。在內地,聯發科的創始人蔡明介則被業內冠以更具爭議性的"黑手機之父"。
這並不妨礙聯發科贏得對手的尊敬。"在聯發科面前,我們還只能算'小弟'"。展訊科技的總裁武平對《環球企業家》說。展訊總部位於上海,是內地第一家在納斯達克上市的晶片設計公司。
而做到這一切,聯發科幾乎用的是火箭般的速度:它進入手機晶片領域,至今不過只有7年光景;進入內地市場,也只有3年。
身材瘦小、不善言辭的蔡明介並不認為這是多麼值得誇耀的成就。"我們只是為這個行業提供了應有的附加價值",他告訴本刊記者,"我不是什麼'手機教父',也千萬不要用'統治力'這個詞。"
這是他第一次接受內地媒體的專訪。
培養手機業的"戴爾"
2000年,聯發科準備進軍手機晶片行業時,沒有人看好蔡明介。
工程師出身的蔡明介曾被臺灣業界稱為"一代拳王"——聯發科從光存儲晶片起家,現在全球70%的DVD機裏都是聯發科提供的控制晶片。在積體電路和晶片設計行業,大多數公司都是靠一款產品吃飯。人們都不相信聯發科能打破這一點。
直到2003年,聯發科都沒有進入業內主要玩家的法眼。當年一位元跨國半導體公司臺灣地區業務高階主管彙報亞太總部競爭者消息,"要注意聯發科這家公司。"亞太區總經理的回答是:"他們的技術很低階,不用擔心。"但到了2007年,這位跨國公司業務高階主管氣急敗壞地說,"我早就告訴他們,結果現在呢?到了今年的全球經理人會議,全球總裁才說'我們應該和臺灣的聯發科學習'。"
1999年底,蔡明介從美國一家名為Rockwell的手機基帶晶片開發公司挖來徐至強,準備著手手機晶片的開發。據稱徐是當時華人圈裏僅有的兩位可以帶隊開發手機基帶晶片的人之一。三年後,聯發科的手機晶片部門正式運營,徐出任該部門的總經理。當時市場上主流的晶片公司是高通、德州儀器、愛立信、飛利浦等,它們是諾基亞、摩托羅拉等一流公司的主要供應商。聯發科是唯一的中國公司。
當時蔡明介並沒有注意到中國大陸市場是自己的新機會,最初的策略依然是立足臺灣本土。直到他看到明基在內地手機市場取得了一定的銷售業績,並和李耀交談後,才意識到大陸市場的潛力。
到2004年,聯發科決定正式進入內地手機市場。但當時市場環境並不好,國產手機的市場份額開始出現下滑,而且大多數國內公司只相信韓國的設計方案。
徐至強說服的依據只能來自產品本身。相對國外產品,儘管聯發科的價格也便宜不了多少,但功耗更低,而且提供的是名為"Turn-key"的全面解決方案——簡言之,廠商採用了這個方案,只需要加一個手機外殼即可成品——這能大大降低了出貨時間。採用其他公司的解決方案,國內手機公司需要6-9個月甚至是一年才能做出一款手機,而採用"Turn-key",最多是3-6個月就能出品一款手機。這個方案可謂正中黑手機業者下懷。該行業內最極端的比方是,只要有三個人就開始開設手機生產廠:一個人負責採購聯發科的解決方案以及其他配件,一個人負責尋找代工廠,一個人負責銷售和回款。
一直被諾基亞、摩托羅拉、三星和索愛等外資品牌壓制的國產手機廠商最終也認定,聯發科就是他們需要的夥伴。四年前,國產手機依靠渠道的人海戰術,在整體市場份額曾短暫的超過外資品牌,但產品本身一直是短板。後來外資品牌反超,國產手機就一直沒有翻身機會。現在他們終於可以借力聯發科,快速地拿出外觀時髦、功能豐富而價格相對便宜的產品來與外資抗衡,並且簡化了研發時間過長的流程,以便在自己擅長的渠道領域下更多的功夫。長虹手機總經理萬明堅則把這個模式簡單稱之為"向黑手機學習"。
現在,除了天宇朗通,包括聯想移動、波導、長虹、TCL、康佳、創維等一線品牌,以及萬利達、天時達、奧克斯、大顯、唯開等二三線品牌,還有一些貼牌手機,都採用了聯發科的方案。在2006年,根據美林的估計,聯發科的市場佔有已經達到了40%,遠遠超過德州儀器、展訊、ADI、飛利浦等對手。到今年,更是預計市場份額能超過55%。
而隨著"黑手機"一詞成為歷史,聯發科還將從自己一手喂大的這個嘈雜陣營贏來更堅定更為壯大的支持者——今年10月國務院宣佈取消手機生產核准制。
硬幣的另一面
無論蔡明介如何表示謙虛,一個無庸置疑的事實是,正是由於聯發科的出現,手機市場的生產門檻開始降低,手機迅速實現"大宗商品化"。
不久前,一位元手機渠道代理商和聯想移動的高層開起來玩笑。前者說,現在有了聯發科,聯想移動的研發中心是不是要考慮重新定位角色了。他給出的建議是,現在既然研發部門是花錢部門,不如將其剝離出去,成立獨立子公司,和聯發科開展專案合作,提供更完善的解決方案給所有的國產手機公司。這樣還能賺錢。
這種方案聯想移動自然不會接受。但卻足以說明聯發科在出現爆炸式增長後,帶來了的給廠商們的另一面影響——由於聯發科基本是"承包"了前期開發的晶片、軟體和穩定性諸多問題,這固然加快了廠商的出貨能力,也幫助一些廠商迅速提高市場份額,但對一些有品牌知名度和研發勢力的廠商來說,它們開始擔心自己的研發和創新能力由此會逐步喪失。更極端的說法認為,聯發科的"Turn-key"解決方案有如鴉片,抽上癮會很舒服,但最後會讓手機廠商陷入無法花時間建立核心競爭力之苦。
國產手機品牌中唯一不和聯發科合作的夏新,一定程度上就是出於這種擔心。夏新採用的是展訊的解決方案,最初展訊也和聯發科一樣,提供整套的解決方案,但後來發現效果並不好。於是展訊決定在產品開發上"退一步"——不再提供完整方案,而是只做了一半,廠商在展訊平臺的基礎上,可以繼續做應用層面的開發,展訊同時給予配合。"這樣就有助於終端廠商提高自己的技術開發能力,有助於實現產品的個性化,有助於新業務的推廣。"展訊科技的總裁武平說。
這樣的合作已經有成功的案例。今年年初,夏新推出一款基於展訊晶片的超薄直板手機E70。其中一些具體應用就是夏新自身開發的,在一個季度的銷量中,曾拿到國產品牌冠軍的位置。
對聯發科來說,實際面臨的風險也不止來自廠商,更多的還是自身。在以產品自身為核心競爭力的手機晶片行業,如果某一款產品出現誤差,就很容易會給對手留下機會。聯發科的產品一路升級,都未曾出現問題。但在國內市場近期頗為流行的雙網雙待手機上,卻出現了一些紕漏。一位元黑手機的代理商對本刊說,聯發科提供這款雙晶片,返修率非常高,而展訊提供的單晶片解決方案,卻效果良好。"要知道廣東這邊的生產跟風現象嚴重",一位元當地的國有電子產品生產商的主管對本刊說。一旦這些雙晶片支援的手機出現更大規模的返修情況,一周到一個月之內,這些工廠都不會採用聯發科的這種晶片,而轉投他人懷抱。
此外,儘管聯發科限制廠商在採用自己的晶片後,又去採用聯發科對手的產品,但實際上,這種限制不可能完全做到。除了天宇朗通和康佳兩個廠商外,聯發科的其他合作者也沒有只把賭注放在了聯發科身上。比如聯想移動,其晶片解決方案提供方除了聯發科外,還包括展訊、德州儀器、博通(Broadcom)等。波導的採購名單則包括英飛淩、德州儀器和聯發科;TCL的是阿爾卡特和聯發科。
"供應商怎麼決定採購方的做法呢?" 一位國產廠商代表明確對本刊表示,尤其是3G來臨後,一些美國公司如高通的產品線要比聯發科更加完整,屆時國內廠商也勢必更多考慮國外公司的解決方案。榮秀麗也稱,如果未來展訊也有更好的產品,不排除繼續合作的可能。
"Stay in business"
53歲的蔡明介在各種挑戰面前並不是個新手。他自言是一個危機感很強的人。和另一位臺灣半導體行業的先驅式人物、被當地輿論稱為"梟雄"的聯電集團董事長曹興誠相比,蔡明介更加突出的特徵是謹慎小心、步步為營。
他從來不認為自己有幹一番大事業的雄心,而只是"不同階段有不同需求,必須去學"。他常掛在嘴邊的一句話,是來自孟子的"無敵國外患者,國恒亡"。與此相對應,另一句他也常常提及的話是,管理大師德魯克的"The most important business of every business is to stay in business"。
今年9月,聯發科以3.5億美元收購ADI的手機晶片業務部門,這就可以視為是蔡明介應對聯發科產品組合尚不完善風險,以繼續"stay in business"的最新舉措。收購後,聯發科獲得了一支近400位經驗豐富的員工團隊。一方面可以彌補現有產品的不足,以便向高端擴展,打開歐美市場;一方面,更重要的是,能為大陸未來的3G市場做準備——ADI的產品涵蓋了WCDMA和TD-SCDMA。
收購ADI的手機晶片部門前,聯發科所做的大量細緻的調查也足以顯示蔡的謹慎。在收到投行的收購邀請後,聯發科的團隊立刻向這幾年所有做了海外並購的中國公司——聯想、TCL、明基等諮詢意見。尤其著重瞭解明基遇到的工會、成本、跨文化融合等問題。逐一確定自己都能解決後,才發出收購要求。由蔡明介最後拍板決定。在收購完成後,徐至強每個月都有一大半的時間呆在ADI的總部波士頓,處理各種細節問題。
事實上,蔡明介十年來在聯發科的成功,謹慎小心正是貫穿始終的一個主導原則。1997年,從聯電集團分拆出來後,聯發科本來有機會為日本一些大廠提供初步晶片方案,但蔡還是先選擇了當地的代工廠廣明、建興等做為客戶以積累經驗。後來臺灣晶片設計業整體水平逐步上升,聯發科開慢慢將三星和索尼發展為直接客戶。到現在,聯發科已經是全球光存儲晶片領域第一大公司、佔據了全球DVD晶片70%的市場份額。
在蔡明介認為DVD、光存儲領域再難以出現高速增長,從而轉向手機晶片領域時,亦並非一步越過,也是仔細盤算、小心求證。2004年,在蔡決定進入內地手機市場後,也沒有直接選擇手機公司,而是在臺灣成立了一家手機設計合資公司達智,從事ODM業務,先做前期觀察。隨後又和一些所謂白牌的手機生產商合作——這是聯發科三年前被稱為"黑手機之父"的根源——在佔有率達到一定量的時候,才主動尋求和聯想、波導、康佳這樣的大廠商合作。現在手機晶片業務已經佔據了聯發科整體業務的50%。
多年來,蔡明介和聯發科保持如此低調,正是因為在積體電路和晶片設計行業,先推出者會獲得高利潤回報,而晚到者則有可能全盤皆輸。"如果不是為了打對手,聯發科不會高調出來。"臺灣一位行業觀察家對本刊說。但今天已躋身全球前三強的聯發科,保持寂寂無名將會越來越困難。更何況,蔡明介對市場的野心尚沒有止步。
在蔡明介的計畫中,下一步除了中國的3G市場外,也期待能和諾基亞、摩托羅拉這樣的國際公司合作——畢竟後者加起來佔據了全球手機市場80%的份額。與此同時,蔡明介正在瞄準手機之外的市場機會,一如當年從光存儲領域跨越到手機市場那樣。聯發科已經收購總部位於美國加州NuCore公司的數碼相機晶片部門。曾經在臺灣IT業一蹶不振的揚智,被聯發科收購後正激進地切入大陸多媒體播放機(即與iPod競爭的MP3/MP4)市場。"蔡明介的強項之一,可以說是翻修公司,把爛公司變成獲利武器。"上述臺灣觀察家說。
頭髮已經略顯花白的蔡明介似乎依然沒有退休計畫。他最佩服郭台銘的以身作則,事實上他自己也同樣如此——每天工作近12個小時。住地離臺北新竹科學園區的總部,也就十五分鐘的車程。生活樸實,平時爬爬山就是最大的業餘愛好。
"我真的退休了,聯發科在華人圈還是一個很重要的科技公司,我的希望就達到了。"蔡明介帶著濃濃的台南口音說。(本刊記者倪妮對此文亦有貢獻)
(本文來源:環球企業家 )
2008年10月14日 星期二
參考資料
Arduino
- +++ Arduino
- Accelerometer ADXL330 with an AVR - Evil Mad Scientist Lab
- Accelerometer Triple Axis LIS3LV02DQ
- Arduino code&examples
- Arduino Forum
- arduino meets processing
- Arduino playground
- Arduino Tutorial
- Arduino Workshops - Webzone
- Arduino: tutorial
- Boarduino
- DIY tilit sensing mouse - ElectronicsLab blog
- Electronic Game Part 2
- NKC electronics
- Electronics-Lab.com Blog » Arduino
- How to have fun with Arduino - Instructables
- gonium.net
- Internal clock and fuse settings
- Wii nunchuck and Arduino
- ITP - Arduino Breadboard
- ITP - Analog In
- ITP - DC Motor Control
- ITP - Digital In Out
- ITP - Serial
- ITP - Servo
- MAKE: Blog: Arduino Archives
- Manuel de référence Arduino
- Médias-cité - Arduino
- Modern Device Company
- Near Future Laboratory » Arduino
- pcb-europe
- Physical Computing
- Physical Computing by toddholoubek
- Read wii nunchuck data into arduino
- Resistance Calculator
- Rob Faludi’s Blog
- Self Sufficient Arduino Board - Instructables
- The World Famous Index of Freeduino Knowledge
- tinker.it » Arduino
- todbot blog
- Wii Nunchucks, and Servos
- Turn Arduino into an AVR-ISP programmer
- Ubuntu et Arduino
- Arduino on a prototype board
- uC Hobby » Arduino
- Wiring
- Wolf Paulus' Web Journal
R/C - AutoPilot
- ArduCopter V1 Beta - Arduino Forum
- Arduino platform for UAVs - DIY Drones
- Balloon Trajectory Forecasts
- Cloudcap Tech
- Continental Controls & Design
- Controlled RC Transmitter - Arduino Forum
- DIY Drones
- FMA Direct
- Low Cost Auto Pilot Using Fma Autopilot And Gps - RC Groups
- MAV-blog : Accelerometer to pitch and roll
- MAV-blog : Gyroscope to roll, pitch and yaw
- MicroPilot - World Leader in Small UAV Autopilots
- On MAV's, UAV's, RC-airplanes, technology and random thoughts
- OpenUAV
- Paparazzi
- Picopilot and Miss2 setup - RCAPA
- Projets électronique modélisme
- RCAP - Wikibooks, collection of open-content textbooks
- Servo Control - Principia Labs
- Supermiss + Picopilot UAV video - RC Groups
- Surveyor SRV-1 Blackfin Camera Board
- UAVS.net
- UNAV autopilot
- Vicacopter
- Viking Aerospace, LLC
- William Park's UAV(UAS) Center
- Wired Science . Video: DIY UAVs | PBS
- YouTube - heroineworshipper's Channel
- Jack Crossfire's blog - RC Groups
GPS
- GPS simulator ++++
- GPS Simulator
- GooPs +++
- GPS Waypoint Navigation with Fixed-Wing +++
- Modulo Arduino Gps - GizmoBits +++
- Waypoint-Math.pdf +++
- GPS Coordinate Converter, Maps and Info
- Arduino : GPS
- Arduino Forum - Waypoint Gps Navigation for UAVS with Arduino
- Arduino playground | Tutorials / GPS
- Arduino Forum - Arduino GPS waypoints nav for UAVS FINAL!!!
- GPSread - Still Open
- GPS module - SquidBee
- GLOBALSAT EM-406 GPS SIRF III ENGINE BOARD - GPS Modules
- GPS Evaluation Board
- GPS simulator
- Navit - Car navigation system
- NMEA sentence information
- NMEA.txt
- Transystem FAQ
- Gps Simulation - VSPD Mobile emulates COM-ports Split one serial port into many virtual ones
ATMEL / AVR
- AVRDUDE
- AVR Fuse Calculator
- AVR LibC
- AVRDUDE - AVR Downloader/UploaDEr
- Atmel AVR - Wikibot
- Atmel AVR - Wikipedia, the free encyclopedia
- Atmel AVR Projects
- Atmel AVR microcontrollers | Windmeadow Labs
- Atmel Corporation
- Atmel Corporation - AVR 8-Bit RISC - Tools & Software
- Atmex - Entry-Level ATMel EXperimentation System
- AVR 8-Bit RISC from Atmel
- AVR Beginners
- AVR Freaks
- AVR mini board with additional boards - Instructables
- AVR Tutor
- AVR Tutorial
- AVR USB - A Firmware-Only USB Driver for Atmel AVR Microcontrollers
- Educational board for Attiny 2313 - Instructables
- USBtiny
- USBtinyISP - Inexpensive USB AVR Programmer
- WinAVR (for ATMEL AVR)
- USB programmer for Atmel AVR
- myAVR
- microcontroleurs Atmega
- Captain's Universe