
写了一个可以调整转速的iphone程序,似乎有点供电不足(查出的原因是外接电源电流过大造成的,现在改用5v移动电源通过USB口供电),电阻发热量也有点大。
参考资料:
iOS设备的Socket通讯 http://freegezi.net/blog/2011/12/325
Arduino驱动四相五线步进电机 http://freegezi.net/blog/2011/12/317
Arduino读写永久数据 http://freegezi.net/blog/2012/01/342

写了一个可以调整转速的iphone程序,似乎有点供电不足(查出的原因是外接电源电流过大造成的,现在改用5v移动电源通过USB口供电),电阻发热量也有点大。
参考资料:
iOS设备的Socket通讯 http://freegezi.net/blog/2011/12/325
Arduino驱动四相五线步进电机 http://freegezi.net/blog/2011/12/317
Arduino读写永久数据 http://freegezi.net/blog/2012/01/342
EEPROM(电可擦写可编程只读存储器)是可用户更改的只读存储器(ROM)——一种掉电后数据不丢失的存储芯片。其可通过高于普通电压的作用来擦除和重编程(重写)。
arduino提供很方便的读写EEPROM的函数。这块Arduino Duemilanove板载只有512bytes,不过存简单数据已经足够了。
#include <EEPROM.h>
int addr = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0) {
int val = Serial.read();
EEPROM.write(addr, val);
Serial.print("I received: ");
Serial.println(val);
}
int value = EEPROM.read(addr);
Serial.print("Value: ");
Serial.println(value);
delay(1000);
}
通过几个晚上的折腾,终于打通了通讯的所有环节。WIFI串口需要3.3V的供电,Arduino上的3.3V供电的时候降压到了2.3V导致WIFI串口无法正常工作。现在用5V串了个2欧的电阻,工作电压稳定在3.5V。
Arduino的接收代码:
void setup(){
Serial.begin(115200);
}
void loop() {
while(Serial.available()>0){
Serial.print(Serial.read(),HEX);
Serial.print("\r\n");
}
delay(100);
}
iPhone端的发送代码:
AsyncSocket * asyncSocket;
-(void)sendDataToWifi{
Byte byte[] = {0x7f};
NSData *adata = [[NSData alloc] initWithBytes:byte length:1];
[asyncSocket writeData:adata withTimeout:-1 tag:1009];
}
8月份就入了一块wifi串口模块,打算用它来控制赤道仪.因为工作太忙,一直没有开始研究.趁着看月全食的空隙,花了1天时间开始折腾这个模块.
wifi串口模块设置成无线串口模式,ios设备手动输入ip和网关.
ios app使用了asyncSocket开源库(https://github.com/robbiehanson/CocoaAsyncSocket)项目需要导入CFNetwork.framework.
这样通过socket就可以发送数据到wifi串口模块,后续工作是让arduino接收来自wifi串口数据并控制电机转速.


28BYJ48 四相五线步进电机,电压为DC5V—DC12V,这个电机通过减速齿轮1:64减速输出,实际步距角度是5.625度
八拍方式驱动:0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09
int Pin0 = 10;
int Pin1 = 11;
int Pin2 = 12;
int Pin3 = 13;
int _step = 0;
boolean dir = true;//正反转
int stepperSpeed = 5;//电机转速,5ms一步
void setup()
{
pinMode(Pin0, OUTPUT);
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
}
void loop()
{
switch(_step){
case 0:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 1:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, HIGH);
break;
case 2:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 3:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 4:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 5:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 6:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 7:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
default:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
}
if(dir){
_step++;
}else{
_step--;
}
if(_step>7){
_step=0;
}
if(_step<0){
_step=7;
}
delay(stepperSpeed);
}