ECE3872 HW/SW Project Code
Dependencies: mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1
motor_ctl_t.h
- Committer:
- trmontgomery
- Date:
- 2020-04-14
- Revision:
- 26:2063ee8419cc
- Parent:
- 25:7764baddb7bc
File content as of revision 26:2063ee8419cc:
// Move servos in playback mode
#include "mbed.h"
#include "Servo.h"
#include "rtos.h"
Servo r_arm(p24);
Servo l_arm(p23);
Servo r_leg(p22);
Servo l_leg(p21);
Thread t_r_arm;
Thread t_l_arm;
Thread t_r_leg;
Thread t_l_leg;
DigitalOut led(LED4);
int i = 0;
int j = 0;
//left sensor move whole left side
//right sensor moves whole right side //not gonna think about this right now. Dicuss ideas with team.
//and then the distance can just control the height
//movement pattern can be random.. right now every other note recorded will be distributed to one side and the rest will go to the other
unsigned short move_map[] {0x149, 0x14A, 0x14C, 0x151, 0x152, 0x154, 0x291, 0x292, 0x294, 0x2A1, 0x2A2, 0x2A4};
unsigned short ra_mask = 0x0C0;
unsigned short la_mask = 0x300;
unsigned short rl_mask = 0x03C;
unsigned short ll_mask = 0x007;
//for testing run through move map
// new class to play a note on Speaker based on PwmOut class
class Puppet
{
public:
Puppet(){ //do I need pins if I keep the global var?
}
void dance(unsigned short[]);
void ra_dance(unsigned short);
void la_dance(unsigned short);
void nextmove();
private:
Timeout moveduration;
int movecount;
float vol;
unsigned short * movementptr;
};
//Interrupt Routine to play next note
void Puppet::nextmove()
{
//_pin = 0.0; //need to set the servo to start up here?
r_arm.write(0);
l_arm.write(0);
movecount++; //setup next note in song
if (movementptr[movecount++] == 0.0) movecount = 0;
ra_dance(movementptr[movecount]);
la_dance(movementptr[movecount]);
moveduration.attach(this,&Puppet::nextmove, 0.2);
}
void Puppet::ra_dance(unsigned short move) {
/*
if (move & ra_mask == 0x040){
r_arm.write(1);
} else {
r_arm.write(.2);
}*/
if(i > 1) i = 0;
r_arm.write(i);
i += 0.1;
}
void Puppet::la_dance(unsigned short move) {
/* if (move & ra_mask == 0x100){
l_arm.write(1);
} else {
l_arm.write(.25);
}*/
if(j > 1) j = 0;
l_arm.write(i);
j += 0.1;
}
void Puppet::dance(unsigned short movement[]) {
movecount = 0;
movementptr = movement;
ra_dance(movement[movecount]);
la_dance(movement[movecount]);
moveduration.attach(this,&Puppet::nextmove, 0.2);
// setup timer to interrupt for next note to play
//returns after first note starts to play
}
void puppet_move(){
Puppet pupper;
// Start song and return once playing starts
pupper.dance(move_map);
// loops forever while song continues to play to end using interrupts
while(1) {
led = !led;
wait(.1);
}
}
