static void set_servos(uint32_t pos1_us, uint32_t pos2_us)
{
     gpio_toggle(GPIOC, GPIO13); /* LED on/off */   
     servo_set_position(SERVO_CH1, pos1_us);
     servo_set_position(SERVO_CH2, pos2_us);
     delay(45000000);
}
Esempio n. 2
0
void handle_error()
{
	state = StateDisconnected;
	led_off(UART0_LED_STATE);
	servo_set_position(DOCK_SERVO_ZAXIS_ID, DOCK_SERVO_POWER_OFF);
	servo_set_position(DOCK_SERVO_XAXIS_ID, DOCK_SERVO_POWER_OFF);
	uart0_flush();
}
Esempio n. 3
0
void send_error(ErrorCode code, uint8_t seq)
{
	const uint8_t size = (seq ? 0x06 : 0x05);
	uint8_t msg[size];

	state = StateDisconnected;
	led_off(UART0_LED_STATE);
	servo_set_position(DOCK_SERVO_ZAXIS_ID, DOCK_SERVO_POWER_OFF);
	servo_set_position(DOCK_SERVO_XAXIS_ID, DOCK_SERVO_POWER_OFF);

	msg[0] = IdErrorMessage;
	msg[1] = size;
	msg[2] = sequence++;
	msg[3] = code;
	if (seq)
	{
		msg[4] = seq;
	}
	msg[size - 1] = calc_checksum(msg);

	uart0_write_buffer(msg, size);
}
Esempio n. 4
0
void handle_servo_ctrl()
{
	if (state != StateConnected)
	{
		send_error(ErrorDisconnect, message.sequence);
		return;
	}

	if (message.data_size != 2)
	{
		send_error(ErrorParser, message.sequence);
		return;
	}

	uint8_t id = message.data[0];
	if (id == DOCK_SERVO_ZAXIS_ID)
	{
		dock_set_docktype(ManualDocking);
	}

	servo_set_position(id, message.data[1]);
	send_ack(message.sequence);
}
Esempio n. 5
0
/* Initialize servo module. */
void
servo_init (void)
{
    /* Set-up all the pins of the servo to out direction */
    AC_SERVO_DDR = 0xff;
    /* All pins are at low state by default */

    /* Set-up the timer/counter 2:
       - prescaler 256 => 4.44 ms TOP */
    TCCR2 = regv (FOC2, WGM20, COM21, COM20, WGM21, CS22, CS21, CS20,
		     0,    0,     0,     0,     0,    1,     0,    0);

    /* The state machine start with the first servo */
    servo_updating_id_ = 0;

    /* Enable overflow interrupt */
    set_bit (TIMSK, TOIE2);

    /* By default, servo init disable all servo. */
    uint8_t i;
    for (i = 0; i < SERVO_NUMBER; i++)
	servo_set_position (i, 0);
}
Esempio n. 6
0
int main(void)
{
     clock_init();
     gpio_init();
     servo_init();

     gpio_set(GPIOC, GPIO12);

     delay(150000000);

     // let pan-til "look around a little"
     while(1) {
          servo_set_position(SERVO_CH1, SERVO_MIN);
          servo_set_position(SERVO_CH2, SERVO_MAX);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_MAX);
          servo_set_position(SERVO_CH2, SERVO_MIN);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_MIN);
          servo_set_position(SERVO_CH2, SERVO_MIN);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_MAX);
          servo_set_position(SERVO_CH2, SERVO_MAX);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_MIN);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_MAX);
          servo_set_position(SERVO_CH2, SERVO_NULL);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_MIN);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_MAX);
          delay(15000000);

          servo_set_position(SERVO_CH1, SERVO_NULL);
          servo_set_position(SERVO_CH2, SERVO_NULL);
          delay(15000000);
     }

     return 0;
}
Esempio n. 7
0
static void run(void)
{
  robot_console_printf("\n\n\n");
 
  int i;
  float y[2*NB_CPG];
  float dy[2*NB_CPG];
  float x[NB_CPG];
  float delta = 0.0;
  float speed = 0.0;
  float drive =0.0;
  char speed_char[10];
  char drive_char[10];
  
  /*for (i = 0;i<7;i++) {
    old_pos[i] = current_position[i];
  }*/
  /*float initial_conditions[2*NB_CPG]={0.0, 0.0, 0.0, 0.0,
                                0.1, 0.0, 0.0, 0.0,
                                0.0, 0.0, 0.0, 0.1,
                                0.0, 0.0, 0.0, 0.0,
                                0.2, 0.1};*/
  //base values
  
  
  //FILE* fileID =  fopen("recherche_syst.m", "w");
  //fprintf(fileID, "Z = [ ");
 
  float   v;
   
  float R[NB_CPG];
   
  for(i=0; i<2*NB_CPG; ++i)
  {
    y[i] = 0.2; //initial_conditions[i]; // (float)(9-(i/2))/10.0;
    dy[i] = 0.0;
  }
  
  // run TIME miliseconds 
  for(i = 0 ; i < TIME ; i += TIME_STEP) 
  {
    drive=getDrive(drive);
    v = drive;
    set_ampl(v, R);
    fcn(y, dy, v, R, current_movement);
    euler(y,dy,TIME_STEP);
    next_step(x,y);
    //fprintf(fileID," %f %f %f %f %f %f ;\n", y[2]-y[0], y[4]-y[0], y[6]-y[2], y[6]-y[4], y[6]-y[0], y[2]-y[4]);
    
    // Calculate speed
    if (!(i%(TIME_STEP*50))) {
      //Every 50 TIME_STEP to avoid oscillations (= 800ms)
      delta = pow(pow((current_position[0]- old_pos[0]),2) + pow((current_position[2]-old_pos[2]),2), 0.5);
      old_pos[0] = current_position[0];
      old_pos[2] = current_position[2];
      speed = 1000*delta/((float)50*TIME_STEP);
    }
    //robot_console_printf("Speed : %d, ,%f, %f, %f, %f\n", i, delta, speed, old_pos[0], current_position[0]);
    
    elapsed_time += (float) TIME_STEP / 1000;    
    /*if (elapsed_time > 5.0 && abs(delta) < 0.000001)  {//abs(current_position[6]) > 2) {
      break;
    }*/
    
    
    // Print informations
    sprintf(drive_char, "%.2f", drive);
    sprintf(speed_char, "%.2f", speed);
    
    
    supervisor_set_label(3, drive_char, 0.16, 0.01, 0.04, 0x0000ff); /* blue movement */
    supervisor_set_label(4, getCurrentMovementString(), 0.16, 0.045, 0.04, 0x0000ff); /* blue movement */
    supervisor_set_label(5, speed_char, 0.16, 0.08, 0.04, 0xff0000); /* red speed */
    
    // actuate front legs
    servo_set_position(servos[0], x[0]);
    servo_set_position(servos[2], x[2]);
    
    //actuate front kmees
    servo_set_position(servos[5], x[4]);
    servo_set_position(servos[7], x[6]);
    
    // actuate back legs
    servo_set_position(servos[1], x[1]);
    servo_set_position(servos[3], x[3]);
    
    //actuate back knees
    servo_set_position(servos[6], x[5]);
    servo_set_position(servos[8], x[7]);
    
    //actuate spine
    servo_set_position(servos[4], x[8]);
    
    robot_step(TIME_STEP);
  }
  
  
  
  
  // Reset
  servo_set_position(servos[0], 0);
  servo_set_position(servos[1], 0);
  servo_set_position(servos[2], 0);
  servo_set_position(servos[3], 0);
  servo_set_position(servos[4], 0);
  servo_set_position(servos[5], 0);
  servo_set_position(servos[6], 0);
  servo_set_position(servos[7], 0);
  servo_set_position(servos[8], 0);
  
  const float FLOAT_POS[7] = { 0, 1000, 0, 0, 1, 0, 0 };
  supervisor_field_set(ghostdog, SUPERVISOR_FIELD_TRANSLATION_AND_ROTATION,(void*)FLOAT_POS);
    
  robot_step(10*TIME_STEP);
      
  const float INITIAL_POSITION_AND_ROTATION[7] = { 0, 0.3, 0, 0, 1, 0, 0 };
  supervisor_field_set(ghostdog, SUPERVISOR_FIELD_TRANSLATION_AND_ROTATION,(void*)INITIAL_POSITION_AND_ROTATION);
  
  elapsed_time = 0.0;
  //fclose(fileID);
}
Esempio n. 8
0
static int run(int ms)
{
	int i,j;
	unsigned short sensors_value[MAX_SENSOR_NUMBER];
	int connector_presence[MAX_CONNECTOR_NUMBER];
	float speed[2];
	float dxEmit, dzEmit;
 	char sendMessage[20];  // message that robot sends
	char angleMessage[20];  // angle to turn piece

	// Update the keyboard
	keyboard();

	// Update the distance sensors
	for (i = 0; i < sensor_number; i++) {
		sensors_value[i] = distance_sensor_get_value(sensors[i]);
	}

	// Update the connector presence sensors
	for (i = 0; i < MAX_CONNECTOR_NUMBER; i++) {
		connector_presence[i] = connector_get_presence(connectors[i]);
	}
	////robot_console_printf("Connectors : %d %d\n", connector_presence[0], connector_presence[1]);

	// Lock automatically
	if (!unlock && connector_presence[0] &&
		!connector_status[0]) {
		//Should lock
		//robot_console_printf("Lock !\n");
		connector_lock(connectors[0]);
		connector_status[0] = LOCKED;
	}

	// Unlock requested
	if (unlock) {
		connector_unlock(connectors[0]);
		connector_status[0] = UNLOCKED;
	}

	// Allow locking when out of presence
	if (unlock && !connector_presence[0]) {
		unlock= !unlock;
	}

	// Emitter/receiver
	/* Send null-terminated robotID */
	// const char *robotID = robot_get_name();
	// robot_num = robotID[1];
	sprintf(sendMessage, "%s%d%c%c", robot_name, state, pieceType, pieceNum);

 	// strcpy(sendMessage, robotID);
 	// strcat(sendMessage, state2char(state));
 	////robot_console_printf("State: %d\n", state);

	// const char stateChar = state2char(state);
	// const char *sendMessage = strcat(robotID, stateChar);
	robot_console_printf("message: %s\n", sendMessage);
	emitter_send_packet(commEmitter, sendMessage, strlen(sendMessage) + 1);


	// default velocities
	velBraitenberg(sensors_value, speed);

	switch(state){

	case SEARCH_FOR_PIECE:

			// what if it picks up a piece by accident?

			pieceType = '0';
			pieceNum = '0';

			if (receiver_get_queue_length(commReceiver) > 0) {
				/* Read current packet's data */
				const void *buffer = receiver_get_data(commReceiver);
				const char *recMessage = (char*) buffer;

				// what if recMessage is less than 5 indices long?
				if ( (recMessage[0] == 'p' && recMessage[4]=='0') ){
					// it's an unclaimed piece on the floor
					pieceType = recMessage[1];
					pieceNum = recMessage[3];
					robot_console_printf("Piece found-------\n");
	        		robot_console_printf("Message: %s\n", recMessage);
					speed[0] = 0;
					speed[1] = 0;
	        		abortCtr = 0;
	        		waitCtr = 0;
					state = ALIGN_WITH_PIECE;
				}
				receiver_next_packet(commReceiver);
	   		 }

		break;


	case ALIGN_WITH_PIECE:

		if (receiver_get_queue_length(commReceiver)) {
			const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;

			if (recMessage[0] == 'p' &&
				recMessage[1] == pieceType && recMessage[3] == pieceNum) {

				direction = receiver_get_emitter_direction(commReceiver);
				dxEmit = direction[0]; // x distance from emitter of piece
				dzEmit = direction[2]+1;
				//robot_console_printf("showMessage: %s\n", recMessage);

				if (fabs(dxEmit) > EPS_X || fabs(dzEmit) > EPS_Z) {
					//robot_console_printf("dxEmit: %f  dzEmit: %f\n", fabs(dxEmit), fabs(dzEmit));
					////robot_console_printf("Aligning with piece\n");

					//velAlign(speed);   // ALTERNATIVE
					if (dxEmit >= 0) {  // robot rotates about center point
						speed[0] = 4000;
						speed[1] = -4000;
					}
					else {
						speed[0] = -4000;
						speed[1] = 4000;
					}

				} else {
         			// move forward toward piece
         			state = APPROACH_PIECE;
				}

			}
			receiver_next_packet(commReceiver);
		}
		else {
			state = SEARCH_FOR_PIECE;
			//robot_console_printf("ALIGN_WITH_PIECE: Communication broken !\n");
		}
		//speed[0] = 0;
		//speed[1] = 0;
		break;

	case APPROACH_PIECE:

		if (connector_status[0] == UNLOCKED) {
			speed[0] = 5000;
			speed[1] = 5000;
		}
		else {
			state = ROTATE_PIECE;
		}

		break;

	case ROTATE_PIECE:

		if (receiver_get_queue_length(commReceiver) > 0) {
			/* Read current packet's data */
			const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;

			//robot_console_printf("Piece message: %s\n", recMessage);

			if (recMessage[1] == pieceType && recMessage[3] == pieceNum){
					// the piece that it's carrying
				if (recMessage[5] == 'A' && turnAngle == 0) {
         		  sprintf(angleMessage, "%c%c%c%c%c", recMessage[6], recMessage[7], recMessage[8],
                 recMessage[9], recMessage[10]);
                 turnAngle = atof(angleMessage);
                 float arm_position = servo_get_position(arm_servo);
				  ////robot_console_printf("servo : %f ", arm_position);
				 servo_set_position(arm_servo, arm_position+turnAngle);
					//robot_console_printf("Angle message: %s\n", angleMessage);
				}
				if (recMessage[4] == '3') { // piece is now aligned
					// NOTE: 3 is the piece state CARRIED
					turnAngle = 0;

					// turn a little more for certain pieces
					/*if (pieceType == '3' || pieceType == '4') {
						float arm_position = servo_get_position(arm_servo);
				  		servo_set_position(arm_servo, arm_position-0.2);
					} */

					state = SEARCH_FOR_ROBOT;
				}
			}
			receiver_next_packet(commReceiver);
  		}

		speed[0] = 0;
		speed[1] = 0;

		break;

	case SEARCH_FOR_ROBOT:
		//velBraitenberg(sensors_value, speed);
		/* Is there at least one packet in the receiver's queue ? */
		if (receiver_get_queue_length(commReceiver) > 0) {
			const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;
			//robot_console_printf("Message: %s\n", recMessage);

			if (recMessage[0] == 'r' && char2state(recMessage[2])==SEARCH_FOR_ROBOT) {

				// specific assembly plan
				if ( (pieceType == '1' && recMessage[3] == '2') ||
					 (pieceType == '2' && recMessage[3] == '1') ||
					 (pieceType == '3' && recMessage[3] == '4') ||
					 (pieceType == '4' && recMessage[3] == '3') ||
					 (pieceType == '5' && recMessage[3] == '6') ||
					 (pieceType == '6' && recMessage[3] == '5') ||
					 (pieceType == '2' && recMessage[3] == '7') ||
					 (pieceType == '7' && recMessage[3] == '2')) {
			    	robot_console_printf("Robot nearby------\n");
					speed[0] = 0;
					speed[1] = 0;

					if (pieceType == '2' && recMessage[3] == '7') {
						// rotate piece 2 in new position to fit with piece 7
						float arm_position = servo_get_position(arm_servo);
				 		servo_set_position(arm_servo, arm_position-3.14);
					}
					state = ALIGN_WITH_ROBOT;
				}
			}

			receiver_next_packet(commReceiver);
		}

		if (pieceType == '7') {
			//robot_console_printf("Holding piece 7\n");
		//	speed[0] = 0;
		//	speed[1] = 0;
		}

		break;

	case ALIGN_WITH_ROBOT:

		if (receiver_get_queue_length(commReceiver) > 0) {
			// other robot is still in communication range
			/* Read current packet's data */

     		const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;

			// MORE CONDITIONS
			if (recMessage[0] == 'r'){  // it's a robot (not a piece)

				if (robot_num < recMessage[1]) {
					robot1 = robot_num;
					robot2 = recMessage[1];
				}
				else {
					robot1 = recMessage[1];
					robot2 = robot_num;
				}

				/* print null-terminated robotID */
				//robot_console_printf("Message from nearby robot: \"%s\"\n", recMessage);

				////robot_console_printf("Other robot is in state: %d\n",char2state(recMessage[2]));
				if (robot_num == robot2 && char2state(recMessage[2])==ALIGN_WITH_ROBOT) {
					// robot 2 waits while robot 1 aligns
					speed[0] = 0;
					speed[1] = 0;
					state = WAIT;
					//robot_console_printf("Robot is R2, waiting\n");
				}
				if (robot_num == robot1 || (robot_num == robot2 && char2state(recMessage[2])==WAIT)) {
					////robot_console_printf("Robot is R1, aligning\n");
					direction = receiver_get_emitter_direction(commReceiver);
					//robot_console_printf("Direction: [%f %f %f]\n", direction[0],  direction[1], direction[2]);

					dxEmit = direction[0]; // x distance from emitter of other robot
					dzEmit = direction[2]+1;

					// TO DO: replace this with more general code for multiple robots
					if (fabs(dxEmit) > EPS_X || fabs(dzEmit) > EPS_Z) {
						//robot_console_printf("dxEmit: %f  dzEmit: %f\n", fabs(dxEmit), fabs(dzEmit));
						if (dxEmit >= 0) {
							speed[0] = 4000;
							speed[1] = -4000;
						}
						else {
							speed[0] = -4000;
							speed[1] = 4000;
						}
						//velAlign(speed); // alternative
					} else {
						speed[0] = 0;
						speed[1] = 0;
						if (robot_num == robot1) {
							state = WAIT;  // wait for robot 2 to align
						}
						if (robot_num == robot2) {
							state = APPROACH_ROBOT;  // start approach to robot 1
						}
					}
				}

			}
			/* fetch next packet */
			receiver_next_packet(commReceiver);

		}
		else {
			state = SEARCH_FOR_ROBOT;
			//robot_console_printf("ALIGN_WITH_ROBOT: Communication broken !\n");
		}
		break;


	case WAIT:
		// what if it receives other robots' messages?
		if (receiver_get_queue_length(commReceiver) > 0) {
			const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;
			speed[0] = 0;
			speed[1] = 0;
			if (robot_num == robot2 && char2state(recMessage[2])==WAIT) {
				state = ALIGN_WITH_ROBOT;  // robot 1 has finished aligning
			}
			if (robot_num == robot1 && char2state(recMessage[2])==APPROACH_ROBOT) {
				state = APPROACH_ROBOT;
			}
			/* fetch next packet */
			receiver_next_packet(commReceiver);
		}
		else {
			state = SEARCH_FOR_ROBOT;
			//robot_console_printf("WAIT: Communication broken !\n");
		}
		break;

	case APPROACH_ROBOT:
		speed[0] = 3000;
		speed[1] = 3000;

		if (receiver_get_queue_length(commReceiver) > 0) {
			/* Read current packet's data */
			const void *buffer = receiver_get_data(commReceiver);
			const char *recMessage = (char*) buffer;

			// pieces have locked together; numbers are the resulting
			// 	conglomerate piece states
			if (strcmp(recMessage,"Lock5")==0 ||
				strcmp(recMessage,"Lock6")==0 ||
				strcmp(recMessage,"Lock7")==0 ||
				strcmp(recMessage,"Lock8")==0 ){
					// the piece that it's carrying
				speed[0] = 0;
				speed[1] = 0;
				// pieceType of robot not carrying piece will later go back to '0'
				pieceTypeNew = recMessage[4];
				state = SEPARATE_ROBOTS;
			}
			receiver_next_packet(commReceiver);
  		}

		break;

	case SEPARATE_ROBOTS:

		//speed[0] = 0;
		//speed[1] = 0;
		//if (receiver_get_queue_length(commReceiver) > 0) {
			/* Read current packet's data */
		//	const void *buffer = receiver_get_data(commReceiver);
		//	const char *recMessage = (char*) buffer;

		//	if (recMessage[0] == 'r' &&
		//	    char2state(recMessage[2])==SEPARATE_ROBOTS) {
					if (ctr == 0 &&
					    (pieceType == '2' || pieceType == '3' || pieceType == '5')) {
						// detach from magnet
						robot_console_printf("Detach-------\n");
						unlock = true;
					}
					if (ctr < 25) { //back up
						speed[0] = -8000;
						speed[1] = -8000;
						ctr += 1;
					}
					else if (ctr >= 20 && ctr < 45) {  // turn away from other robot
						speed[0] = -8000;
						speed[1] = 8000;
						ctr += 1;
					}
					else {
						ctr = 0;
						if (pieceType == '1' || pieceType == '4') { // ||
						    //pieceType == '6') { // hold onto piece
						    pieceType = pieceTypeNew;
							state = SEARCH_FOR_ROBOT;
						}
						else if (pieceType == '6') {
							pieceType = pieceTypeNew;
							float arm_position = servo_get_position(arm_servo);
				  			servo_set_position(arm_servo, arm_position-1.57);
				  			state = SEARCH_FOR_ROBOT;
						}
						else if (pieceType == '2' || pieceType == '3' ||
						         pieceType == '5') {
							state = SEARCH_FOR_PIECE;
						}
						else if (pieceType == '7') {  // puzzle is completed
							unlock = true;
							state = SEARCH_FOR_PIECE;
						}

					}
			//}
			//receiver_next_packet(commReceiver);
  		//}

		break;

	}


	/* Set the motor speeds */

  //robot_console_printf("Speeds: %d %d\n", (int) speed[0], (int) speed[1]);
	differential_wheels_set_speed((int) speed[0], (int) speed[1]);

	// Output the current metrics into the file
	//file_output();

	elapsed_time += (float)TIME_STEP / 1000.0;
	return TIME_STEP;           /* run for TIME_STEP ms */
}
Esempio n. 9
0
/**
 * Move a servo to a specific position.
 * @param  servo_id  the id of the servo to move.
 * @param  position  the position identifier where to move the servo.
 */
void
servo_pos_move_to (uint8_t servo_id, uint8_t position)
{
    servo_set_position (servo_id, servo_pos_high_time[servo_id][position]);
}
Esempio n. 10
0
void set_servo1_position(char* arg, uint8_t arglen)
{
	int16_t pos = atoi(arg);
	servo_set_position(1, pos);
}