/* *************************************************************** Author: Thomas Braunl, 04.Nov.04 for Andy2 (digital motors) after a program written for Johnny Walker by TB on 22.05.98 Purpose: The robot initializes in a balanced upright position. When pressing "go", the robot does squats where the robot bends the hips, knees, ankles, and arms. ********************************************************************/ #include "eyebot.h" #define PORT SERIAL3 #define BAUD SER57600 #define SERVOS 17 // number of servos #define SPEED 3 #define DEBUG 1 #define ANGLE 40 #define WTIME 400 typedef enum{ lHipS, lHipB, lKnee, lAnkleB, lAnkleS, rHipS, rHipB, rKnee, rAnkleB, rAnkleS, lShoulderR, lShoulderB, lEllbow, rShoulderR, rShoulderB, rEllbow, HeadT } MotNames; // drive motor to angle void DriveTo(BYTE motor, BYTE angle, BYTE speed) { BYTE valA, check, ret1, ret2; OSSendCharRS232(0xFF, PORT); // Header valA = (speed<<5) | motor; OSSendCharRS232(valA, PORT); // A: 3 bit speed (0=max, 4=min) + 4 bit ID OSSendCharRS232(angle, PORT); // B: position (0..254) check = (valA ^ angle) & 0x7F; OSSendCharRS232(check, PORT); // checksum (A XOR B) &0x7f OSRecvRS232(&ret1, PORT); // 1: current OSRecvRS232(&ret2, PORT); // 2: position if (DEBUG) LCDPrintf(">Cur %d Pos %d\n", ret1, ret2); } // read motor angle void DriveRead(BYTE motor, BYTE *angle, BYTE *current) { BYTE valA, check; OSSendCharRS232(0xFF, PORT); // Header valA = 0xA0 | motor; OSSendCharRS232(valA, PORT); // A: 101 + ID OSSendCharRS232(0x00, PORT); // B: arbitrary check = valA & 0x7F; OSSendCharRS232(check, PORT); // checksum OSRecvRS232(current, PORT); // 1: current OSRecvRS232(angle, PORT); // 2: position } //read all motor angles void DriveReadAll(BYTE number, BYTE angles[]) { BYTE i, dummy; for (i=0; i