Back

Samenvoegen code robotarm

Aangezien ik als eerste de code voor het uitlezen van de nieuwe versnellingsmeter af had, heb ik deze als eerste samengevoegd met de code voor het aansturen van de motoren. Ik heb de drivers voor de robotarm en de versnellingsmeter samengevoegd in 1 project:

project structure with arm and adxl combined

Ik wilde de robotarm laten bewegen aan de hand van de waarden van de versnellingsmter. Als eerste heb ik alleen de x-waarde gepakt, omdat de robotarm momenteel alleen via de x-as kan bewegen. Ik heb de configuratie van de chip ingesteld volgens de peripherals die nodig waren voor zowel de motor als de versnellingsmeter, en die is hieronder te zien:

pin config for adxl and motor combined

Het belangrijkste aan de configuratie is dat pin A0 ingesteld is op het genereren van een PWM signaal met timer 2 op kanaal 1 (TIM2_CH1) en dat pin B8 ingesteld is op I²C communicatiepin SCL en dat pin B9 ingesteld is op communicatiepin SDA

Hierna heb ik code geschreven om de motor aan te sturen aan de hand van de waarden van de versnellingsmeter. Ik heb een waarde ingesteld van 0.1g #define ADXL345_G_TRESHOLD 0.1 // treshold for moving the arm. De code gebruikt de drivers van de versnellingsmeter en de drivers van de motor voor het uitlezen en aansturen.

In de code kijk ik eerst of er op de blauwe knop op het ontwikkelbord wordt geklikt. Hierna kijk ik of de robotarm moet bewegen. Ik kijk lees daarna de waarde van de x as van de versnellingsmeter uit. Als deze boven de 0.1g zit en de robotarm moet bewegen wordt gekeken of de trilling naar voor of achter is en de arm dus naar boven of naar beneden moet bewegen. Hierna wordt de snelheid van de arm aangepast aan de hand van de waarde van de versnellingsmeter en wordt de robotarm bewogen. Als de robotarm al bewoog en niet meer moet bewegen zal hij stoppen.

            
while (1)
{
	button_state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
	last_should_move = should_move;
	if (!button_state)
	{
		should_move = 1;
	}
	else
	{
		should_move = 0;
	}
	if (last_should_move != should_move)
	{ // the button state changed
		if (should_move)
		{
			can_move_arm = !can_move_arm;
		}
	}
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, can_move_arm);
	read_values_from_sensor(&adxl, direction_values);
	float x = direction_values[0] - adxl.x_offset;
	float x_abs = x < 0 ? -x : x;
	sprintf(buf, "x: %02f\tx_abs:%02f\r\n", x, x_abs);
	UART_send(buf);
	if (adxl.status == 1)
	{
		if (x_abs > ADXL345_G_TRESHOLD && can_move_arm)
		{
			arm.dir = x < 0 ? Down : Up;
			robot_arm_update_direction(&arm);
			int speed = x_abs * 50;
			if (speed > 90)
				speed = 90;
			arm.speed = speed;
			arm.moving = 1;
			robot_arm_update_speed(&arm);
		}
		else
		{
			robot_arm_stop(&arm);
		}
	}
	HAL_Delay(50);	// 50 ms delay
}