# 7688 Duo 啦機破板每週任務
> 如果看了這個還可以被當就可以吃屎了
# 12月07日 Score:100
## MCS_test.py
::: spoiler
``` python
import requests
device_id = "ID"
device_key = "KEY"
data_channel = "gamepad"
url = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url += "/datachannels/" + data_channel + "/datapoints.csv"
def game_pad():
r = requests.get(url, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
print data
high_low = data[0].split("|")[1]
command = data[0].split("|")[0]
return high_low,command
while True:
high_low,command = game_pad()
print(high_low)
print command
if high_low == "1":
if command == "left":
print "press left"
elif command == "right":
print "press right"
elif command == "up":
print "press up"
elif command == "down":
print "press down"
elif command == "A":
print "press A"
elif command == "B":
print "press B"
```
:::
## mearm.ino
::: spoiler
``` cpp
#include <Servo.h>
Servo servo_gripper;
Servo servo_base;
Servo servo_updown;
Servo servo_frontback;
int degree_base = 90; //設定初始角度,請依照您的機械手臂做微調
int degree_updown = 90;
int degree_frontback = 90;
void setup()
{
Serial.begin(115200);
Serial1.begin(57600); //建立Arduino ATMega32U4與MT7688AN之間的連結
servo_gripper.attach(12); //將夾爪的伺服馬達的腳位指定給12號腳位
servo_updown.attach(10); //將升降的伺服馬達的腳位指定給10號腳位
servo_frontback.attach(11); //將前後的伺服馬達的腳位指定給11號腳位
servo_base.attach(9); //將平台的伺服馬達的腳位指定給9號腳位
}
void loop()
{
if(Serial1.available())
{
int command = Serial1.read(); //讀取MT7688AN送來的指令
if(command == 'o') //如果是o的話,就打開夾爪
{
Serial.println("gripper open");
servo_gripper.write(160);
}
else if(command == 'f') //如果是f的話,就合起夾爪
{
Serial.println("gripper closed");
servo_gripper.write(30);
}
else if(command == 'u') //如果是u的話,就上升手臂
{
degree_updown = (++degree_updown > 180) ? 180 : degree_updown;
Serial.print("degree_updown");
Serial.println(degree_updown);
servo_updown.write(degree_updown);
}
else if(command == 'd') //如果是d的話,就下降手臂
{
degree_updown = (--degree_updown < 0) ? 0 : degree_updown;
Serial.print("degree_updown");
Serial.println(degree_updown);
servo_updown.write(degree_updown);
}
else if(command == 'a') //如果是a的話,就前伸手臂
{
degree_frontback = (++degree_frontback > 180) ? 180 : degree_frontback;
Serial.print("degree_frontback: ");
Serial.println(degree_frontback);
servo_frontback.write(degree_frontback);
}
else if(command == 'b') //如果是b的話,就後縮手臂
{
degree_frontback = (--degree_frontback < 0) ? 0 : degree_frontback;
Serial.print("degree_frontback: ");
Serial.println(degree_frontback);
servo_frontback.write(degree_frontback);
}
else if(command == 'l') //如果是l的話,就左轉平台
{
degree_base = (++degree_base > 180) ? 180 : degree_base;
Serial.print("degree_base: ");
Serial.println(degree_base);
servo_base.write(degree_base);
}
else if(command == 'r') //如果是r的話,就右轉平台
{
degree_base = (--degree_base < 0) ? 0 : degree_base;
Serial.print("degree_base: ");
Serial.println(degree_base);
servo_base.write(degree_base);
}
}
}
```
:::
## mearm.py
::: spoiler
``` python
# -*- coding: utf-8 -*-
import requests
import serial
s = serial.Serial("/dev/ttyS0", 57600)
device_id = "您的device id" # 改成您的device id
device_key = "您的device key" # 改成您的device key
data_channel = "gamepad" # 改成您遊戲手把的data channel id
data_channel2 = "gripper" # 改成您開關控制的data channel id
num = 0
last_command2 = ""
url = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url += "/datachannels/" + data_channel + "/datapoints.csv"
url2 = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url2 += "/datachannels/" + data_channel2 + "/datapoints.csv"
def game_pad(): # 接受MCS gamepad資料通道的訊號
r = requests.get(url, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
return (data[0][0], data[0][-1])
def gripper(): # 接收MCS gripper資料通道的訊號
r = requests.get(url2, headers = {"deviceKey" : device_key})
return r.content[-1]
while True: # 判斷接收到的訊號,並發送相對應的指令給Arduino端
command = game_pad()
command2 = gripper()
if last_command2 == "":
last_command2 = command2
else:
if last_command2 != command2:
if command2 == "1":
print "closed"
s.write("f")
elif command2 == "0":
print "open"
s.write("o")
last_command2 = command2
else:
pass
if command[1] == "1":
if command[0] == "l":
print "{} . press left".format(num)
s.write("l")
num = num + 1
elif command[0] == "r":
print "{} . press right".format(num)
s.write("r")
num = num + 1
elif command[0] == "u":
print "{} . press up".format(num)
s.write("u")
num = num + 1
elif command[0] == "d":
print "{} . press down".format(num)
s.write("d")
num = num + 1
elif command[0] == "A":
print "{} . press A".format(num)
s.write("a")
num = num + 1
elif command[0] == "B":
print "{} . press B".format(num)
s.write("b")
num = num + 1
```
:::
# 12月14日 Score:90 理論100
林北輪胎線斷掉
500元破板要重燒
啦機破板聯發科品質不意外
## Mearm_1214.ino
:::spoiler
```cpp
#include <Servo.h>
Servo servo_gripper;
Servo servo_base;
Servo servo_updown;
Servo servo_frontback;
Servo servo_car;
const int ena = 3;
const int In1 = 4;
const int In2 = 5;
const int enb = 8;
const int In3 = 6;
const int In4 = 7;
int degree_base = 90; //設定初始角度,請依照您的機械手臂做微調
int degree_updown = 90;
int degree_frontback = 90;
String Data = "";
void setup()
{
Serial.begin(115200);
Serial1.begin(57600); //建立Arduino ATMega32U4與MT7688AN之間的連結
servo_gripper.attach(12); //將夾爪的伺服馬達的腳位指定給3號腳位
servo_updown.attach(10); //將升降的伺服馬達的腳位指定給5號腳位
servo_frontback.attach(11); //將前後的伺服馬達的腳位指定給6號腳位
servo_base.attach(9); //將平台的伺服馬達的腳位指定給9號腳位
pinMode(In1, OUTPUT);
pinMode(In2, OUTPUT);
pinMode(In3, OUTPUT);
pinMode(In4, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(enb, OUTPUT);
digitalWrite(ena, HIGH);
digitalWrite(enb, HIGH);
}
void loop()
{
if(Serial1.available())
{
while(Serial1.available()>0){
Data += (char)(Serial1.read()); //讀取MT7688AN送來的指令
delay(5); // 沒有delay會有異常
}
Serial.println(Data);
if(Data.startsWith("gripper") == true)
{
Data.replace("gripper ",""); //字串處理,看不懂就算了
int angle = Data.toInt();
Serial.print("gripper:");
Serial.println(angle);
servo_gripper.write(angle);
Data = "";
}
else if(Data.startsWith("updown") == true)
{
Data.replace("updown ","");
int angle = Data.toInt();
Serial.print("updown:");
Serial.println(angle);
servo_updown.write(angle);
Data = "";
}
else if(Data.startsWith("frontback") == true)
{
Data.replace("frontback ","");
int angle = Data.toInt();
Serial.print("frontback:");
Serial.println(angle);
servo_frontback.write(angle);
Data = "";
}
else if(Data.startsWith("base") == true)
{
Data.replace("base ","");
int angle = Data.toInt();
Serial.print("base:");
Serial.println(angle);
servo_base.write(angle);
Data = "";
}
//車車
if(Data=="l"){
Serial.println("Car Left");
mleft(1500);
mstop(500);
Data = "";
}
if(Data=="r"){
Serial.println("Car Right");
mrigt(1500);
mstop(500);
Data = "";
}
if(Data=="d"){
Serial.println("Car back");
mback(2500);
mstop(500);
Data = "";
}
if(Data=="u"){
Serial.println("Car up");
mfrnt(2500);
mstop(500);
Data = "";
}
Data = "";
}
}
void mstop(int j){
digitalWrite(In1, LOW);
digitalWrite(In2, LOW);
digitalWrite(In3, LOW);
digitalWrite(In4, LOW);
delay(j);
}
void mleft(int j){
digitalWrite(In1, HIGH);
digitalWrite(In2, LOW);
digitalWrite(In3, LOW);
digitalWrite(In4, HIGH);
delay(j);
}
void mrigt(int j){
digitalWrite(In1, LOW);
digitalWrite(In2, HIGH);
digitalWrite(In3, HIGH);
digitalWrite(In4, LOW);
delay(j);
}
void mback(int j){
digitalWrite(In1, HIGH);
digitalWrite(In2, LOW);
digitalWrite(In3, HIGH);
digitalWrite(In4, LOW);
delay(j);
}
void mfrnt(int j){
digitalWrite(In1, LOW);
digitalWrite(In2, HIGH);
digitalWrite(In3, LOW);
digitalWrite(In4, HIGH);
delay(j);
}
```
:::
## Mearm_1214.py
:::spoiler
``` python
# -*- coding: utf-8 -*-
import requests
import serial
s = serial.Serial("/dev/ttyS0", 57600)
device_id = "DAcpNv9l" # 改成您的device id
device_key = "ac00YU0lBAj7EHsC" # 改成您的device key
data_channel = "gamepad" # 改成您遊戲手把的data channel id
data_channel2 = "gripper" # 改成您開關控制的data channel id
data_channel3 = "base"
data_channel4 = "updown"
data_channel5 = "frontback"
num = 0
last_command2 = ""
url = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url += "/datachannels/" + data_channel + "/datapoints.csv"
url2 = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url2 += "/datachannels/" + data_channel2 + "/datapoints.csv"
url3 = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url3 += "/datachannels/" + data_channel3 + "/datapoints.csv"
url4 = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url4 += "/datachannels/" + data_channel4 + "/datapoints.csv"
url5 = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url5 += "/datachannels/" + data_channel5 + "/datapoints.csv"
last_gripper = ""
last_base = ""
last_updown = ""
last_frontback = ""
def game_pad(): # 接受MCS game_pad資料通道的訊號
r = requests.get(url, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
return (data[0][0], data[0][-1])
def gripper(): # 接收MCS gripper資料通道的訊號
r = requests.get(url2, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
data_0 = data[0]
grip = "gripper %s"%(data_0) #字串處理
return grip
def base(): # 接收MCS base資料通道的訊號
r = requests.get(url3, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
data_0 = data[0]
grip = "base %s"%(data_0) #字串處理
return grip
def updown(): # 接收MCS updown資料通道的訊號
r = requests.get(url4, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
data_0 = data[0]
grip = "updown %s"%(data_0) #字串處理
return grip
def frontback(): # 接收MCS frontback資料通道的訊號
r = requests.get(url5, headers = {"deviceKey" : device_key})
data = r.content.split(',')[2:]
data_0 = data[0]
grip = "frontback %s"%(data_0) #字串處理
return grip
while True: # 判斷接收到的訊號,並發送相對應的指令給Arduino端
command = game_pad()
grip = gripper()
base1 = base()
updown1 = updown()
frontback1 = frontback()
#基本上下面就是判斷值有沒有變,變了再傳資料
if last_gripper == "":
last_gripper = grip
print(grip)
s.write(grip)
else:
if last_gripper != grip:
print(grip)
s.write(grip)
last_gripper = grip
if last_base == "":
last_base = base1
print(base1)
s.write(base1)
else:
if last_base != base1:
print(base1)
s.write(base1)
last_base = base1
if last_updown == "":
last_updown = updown1
print(updown1)
s.write(updown1)
else:
if last_updown != updown1:
print(updown1)
s.write(updown1)
last_updown = updown1
if last_frontback == "":
last_frontback = frontback1
print(frontback1)
s.write(frontback1)
else:
if last_frontback != frontback1:
print(frontback1)
s.write(frontback1)
last_frontback = frontback1
#控制自走車
if command[1] == "1":
if command[0] == "l":
print "{} . press left".format(num)
s.write("l")
num = num + 1
elif command[0] == "r":
print "{} . press right".format(num)
s.write("r")
num = num + 1
elif command[0] == "u":
print "{} . press up".format(num)
s.write("u")
num = num + 1
elif command[0] == "d":
print "{} . press down".format(num)
s.write("d")
num = num + 1
elif command[0] == "A":
print "{} . press A".format(num)
s.write("a")
num = num + 1
elif command[0] == "B":
print "{} . press B".format(num)
s.write("b")
num = num + 1
```
:::
# 1221.py
::: success
``` python=
import requests
import socket
import threading
import logging
import mraa
import serial
# change this to the values from MCS web console
DEVICE_INFO = {
'device_id' : 'DAcpNv9l',
'device_key' : 'ac00YU0lBAj7EHsC'
}
# change 'INFO' to 'WARNING' to filter info messages
logging.basicConfig(level='INFO')
s = serial.Serial("/dev/ttyS0", 57600)
heartBeatTask = None
def establishCommandChannel():
# Query command server's IP & port
connectionAPI = 'https://api.mediatek.com/mcs/v2/devices/%(device_id)s/connections.csv'
r = requests.get(connectionAPI % DEVICE_INFO,
headers = {'deviceKey' : DEVICE_INFO['device_key'],
'Content-Type' : 'text/csv'})
logging.info("Command Channel IP,port=" + r.text)
(ip, port) = r.text.split(',')
# Connect to command server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.settimeout(None)
# Heartbeat for command server to keep the channel alive
def sendHeartBeat(commandChannel):
keepAliveMessage = '%(device_id)s,%(device_key)s,0' % DEVICE_INFO
commandChannel.sendall(keepAliveMessage)
logging.info("beat:%s" % keepAliveMessage)
def heartBeat(commandChannel):
sendHeartBeat(commandChannel)
# Re-start the timer periodically
global heartBeatTask
heartBeatTask = threading.Timer(40, heartBeat, [commandChannel]).start()
heartBeat(s)
return s
def waitAndExecuteCommand(commandChannel):
while True:
command = commandChannel.recv(1024)
logging.info("recv:" + command)
# command can be a response of heart beat or an update of the LED_Control,
# so we split by ',' and drop device id and device key and check length
fields = command.split(',')[2:]
if len(fields) > 1:
timeStamp, dataChannelId, commandString = fields
if dataChannelId == 'gamepad':
# check the value - it's either 0 or 1
cmd = commandString.split('|')
print(cmd)
s.write(cmd[0])
if dataChannelId == 'base':
# check the value - it's either 0 or 1
print('base '+commandString)
s.write('base '+commandString)
if dataChannelId == 'updown':
# check the value - it's either 0 or 1
print('updown '+commandString)
s.write('updown '+commandString)
if dataChannelId == 'frontback':
# check the value - it's either 0 or 1
print('frontback '+commandString)
s.write('frontback '+commandString)
if dataChannelId == 'gripper':
# check the value - it's either 0 or 1
print('gripper '+commandString)
s.write('gripper '+commandString)
pin = None
if __name__ == '__main__':
channel = establishCommandChannel()
waitAndExecuteCommand(channel)
```
:::