## Posts Tagged ‘控制’

### 解魔方的机器人攻略25 – 解魔方

1，蓝牙连接成功
2，NXT扫描魔方，发送6个面，每个面9块共54组颜色数据到电脑
3，NXT发送一个字节（0xFF）到电脑，表示颜色读取完毕
4，电脑开始计算解法，得到解魔方的步骤，一共N步
5，电脑发送一个字节N到NXT
6，NXT进行从1到N的循环，每次发送一个字节n到电脑，请求第n步操作
7，电脑发送第n步操作给NXT
8，NXT执行完全部N个操作，发送一个字节(0xFE)到电脑，通知解魔方完成
9，电脑清空步骤和颜色数组，准备迎接下一次任务
10，按下Escape按钮，NXT发送三个(0XFF)给电脑，关闭蓝牙连接并退出

```public class CubeCenter
{
public string[] CenterColor = new string[6] { "U", "R", "D", "L", "F", "B" };

public void RotateBottom(bool colockwise)
{
if (colockwise)
{
string n = CenterColor[5];
CenterColor[5] = CenterColor[1];
CenterColor[1] = CenterColor[4];
CenterColor[4] = CenterColor[3];
CenterColor[3] = n;
}
else
{
string n = CenterColor[5];
CenterColor[5] = CenterColor[3];
CenterColor[3] = CenterColor[4];
CenterColor[4] = CenterColor[1];
CenterColor[1] = n;
}
}

public void RotatePaw()
{
//Only can move forward
string n = CenterColor[0];
CenterColor[0] = CenterColor[3];
CenterColor[3] = CenterColor[2];
CenterColor[2] = CenterColor[1];
CenterColor[1] = n;
}

public int FindCenter(string position)
{
int center = -1;
for (int i = 0; i < 6; i++)
{
if (CenterColor[i] == position) center = i;
}
return center;
}
}
```

P: Paw 爪子翻动一次
B：RotateBottom 从底面旋转魔方，后面需要接一个1~3的数字
S：RotateBottomSide 旋转魔方的底面，跟B的区别是这时候爪子抓住上两层，然后旋转底面

```int findSidePosition = CenterStatus.FindCenter(targetSide);

//Rotate to corrent bottom
switch (findSidePosition)
{
case 2:
//Do Nothing
break;
case 1:
CenterStatus.RotatePaw();
break;
case 0:
CenterStatus.RotatePaw();
CenterStatus.RotatePaw();
break;
case 3:
CenterStatus.RotateBottom(true);
CenterStatus.RotateBottom(true);
CenterStatus.RotatePaw();
break;
case 4:
CenterStatus.RotateBottom(true);
CenterStatus.RotatePaw();
break;
case 5:
CenterStatus.RotateBottom(false);
CenterStatus.RotatePaw();
break;
}
Steps[Steps.Count - 1].OrginStep = currentStep;
```

P B3 P S2 B1 P S1

```switch (MoveType)
{
case MoveType.RotatePaw:
return (byte)10;
case MoveType.RotateBottom:
return (byte)(20 + Count);
case MoveType.RotateBottomSide:
return (byte)(30 + Count);
default:
return (byte)0;
}
```

```//Get result
if(step==10)
{
//Rotate paw
Robot.RotatePaw();
}
else if(step>=20 && step<30)
{
//Rotate Bottom
int count = step - 20;
if(count == 3) count = -1;
Robot.RotateBottom(count);
}
else if(step>=30 && step<40)
{
//Rotate Bottom Side
int count = step - 30;
if(count == 3) count = -1;
Robot.RotateBottomSide(count);
}
```

1，用超声波测距传感器（就是那对眼睛）制作“开关”；
2，读色错误，卡住等情况的异常处理
3，语音提示，让萝卜头开口说话
4，暂停功能，帮助我们进行调试

### Arduino开发板实验三：舵机控制

下面这个小实验的目标是用电位器控制舵机的角度，正好在前一个实验里，电位器都还没有拆掉。需要特别注意的是供电部分，舵机转动时电流会比较大，Arduino上的电源芯片可能会因过流保护到发热而损坏，电源需要接到外部供电，切不可使用USB供电。

```int readPin = 6;   //用来连接电位器
int servopin = 7;    //定义舵机接口数字接口7

void servopulse(int angle)//定义一个脉冲函数
{
int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值
digitalWrite(servopin,HIGH);    //将舵机接口电平至高
delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
digitalWrite(servopin,LOW);     //将舵机接口电平至低
delayMicroseconds(20000-pulsewidth);
}

void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}

void loop()
{
//读取电位器（传感器）的读数，接到3.3V，值范围从0到660左右
//把值的范围映射到0到165左右
int angle = readValue / 4;
//发送50个脉冲
for(int i=0;i<50;i++)
{
//引用脉冲函数
servopulse(angle);
}
}
```

### Arduino开发板实验二：模拟输入和输出（用电位器和开关控制直流电机）

1，使用电位器控制直流电机的转速
2，使用开关控制直流电机的旋转方向

```int readValue = analogRead(readPin);
```

PWM输出

PWM模拟输出

```analogWrite(pin, value);
```

1，左右两边是对称的，可以控制两个直流电机，咱们下面只看左边
2，绿色的“直流电机A接口”，用于接电机的两根电源线
3，直流电机A信号输入接口，一共有3个脚，分别是I1,I2和EA。其中I1和I2是数字接口，用于控制开关和方向，EA是模拟接口，用于控制转速

4，最下面的VMS接电源正极，GND接地，边上还有一个+5V，不用管它，本来是由它给逻辑电路供电的，但是默认情况下，是通过DUAL那个跳线帽由VMS搭车送电。

```int readPin = 6;    //用来连接电位器
int buttonPin = 38; //用来连接开关，这次用了个吉利的端口号
int i1Pin = 31;     //连接电机驱动板的I1接口
int i2Pin = 30;     //连接电机驱动板的I2接口
int speedPin = 6;   //连接电机驱动板的EA接口

void setup()
{
pinMode(buttonPin, INPUT);  //开关用于输入
pinMode(i1Pin, OUTPUT);     //I1和I2都是数字信号
pinMode(i2Pin, OUTPUT);     //通过设置I1和I2来控制电机旋转方向
pinMode(speedPin, OUTPUT);  //按占空比方式输出的模拟信号
digitalWrite(buttonPin, HIGH);  //设置上拉电阻
}

void loop()
{
//读取按钮状态
//设置转动方向，I1和I2值相反时，分别对应两种不同的转向；I1和I2值相同时停止转动
digitalWrite(i1Pin, buttonPressed);
digitalWrite(i2Pin, !buttonPressed);
//读取电位器（传感器）的读数，值范围从0到1023