Hello everyone,
I am trying to make a program that makes work a stepper motor 28BYJ-48, my stepper motor is well connected to the ULN2003 and the ULN2003 is well connected to my nrf51dk, here is a picture of my setup :

https://coeleveld.com/arduino-stepper-uln2003a/
I foloowed this tutorial and it worked with my Arduino, so I guess the problem is not coming from there.
I am now making a program using the nrf51dk, I am using nrf51_sdk_10.0.0 and the ble_app_uart as an example, my project is to control the motor via Bluetooth.
But for the moment I just would like to make the motor runing.
so I follow the same principe of code as in the tutorial for making it work.
I need a timer, so I also followed the "Application timer tutorial" from nordic :
devzone.nordicsemi.com/.../application-timer-tutorial
here is my code that I Added to the ble_app_uart project :
//At the top I define the differents gpios that I will have to use
//and step_number that is a variable use to navigate threw the differents steps for the motor to work
int step_number = 0;
#define motorPin1 1
#define motorPin2 2
#define motorPin3 3
#define motorPin4 4
#define APP_TIMER_PRESCALER 15 /**< Value of the RTC1 PRESCALER register. */
#define APP_TIMER_OP_QUEUE_SIZE 5 /**< Size of timer operation queues. */
//I add 4 different timers, one for each pin
APP_TIMER_DEF(timer_step1);
APP_TIMER_DEF(timer_step2);
APP_TIMER_DEF(timer_step3);
APP_TIMER_DEF(timer_step4);
.
.
.
//the code already defined in the existing project
//Timeout handler for the repeated timer
//I need 4 timeout handler, one foreach motorPin
static void timer_a_handler(void * p_context)
{
nrf_drv_gpiote_out_toggle(motorPin1);
}
static void timer_b_handler(void * p_context)
{
nrf_drv_gpiote_out_toggle(motorPin2);
}
static void timer_c_handler(void * p_context)
{
nrf_drv_gpiote_out_toggle(motorPin3);
}
static void timer_d_handler(void * p_context)
{
nrf_drv_gpiote_out_toggle(motorPin4);
}
//Then I create the timers
// Create timers
static void create_timers()
{
uint32_t err_code1;
uint32_t err_code2;
uint32_t err_code3;
uint32_t err_code4;
// Create timers
err_code1 = app_timer_create(&timer_step1,
APP_TIMER_MODE_REPEATED,
timer_a_handler);
APP_ERROR_CHECK(err_code1);
err_code2 = app_timer_create(&timer_step2,
APP_TIMER_MODE_REPEATED,
timer_b_handler);
APP_ERROR_CHECK(err_code2);
err_code3 = app_timer_create(&timer_step3,
APP_TIMER_MODE_REPEATED,
timer_c_handler);
APP_ERROR_CHECK(err_code3);
err_code4 = app_timer_create(&timer_step4,
APP_TIMER_MODE_REPEATED,
timer_c_handler);
APP_ERROR_CHECK(err_code4);
}
//And here is my main
//with the loop to make work the motor the same way I did with the arduino, but adapting the code
int main(void)
{
uint32_t err_code;
uint32_t err_code1;
uint32_t err_code2;
uint32_t err_code3;
uint32_t err_code4;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
uart_init();
buttons_leds_init(&erase_bonds);
ble_stack_init();
gap_params_init();
services_init();
advertising_init();
conn_params_init();
printf("%s",start_string);
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
create_timers();
nrf_gpio_pin_dir_set(motorPin1, NRF_GPIO_PIN_DIR_OUTPUT);
nrf_gpio_pin_dir_set(motorPin2, NRF_GPIO_PIN_DIR_OUTPUT);
nrf_gpio_pin_dir_set(motorPin3, NRF_GPIO_PIN_DIR_OUTPUT);
nrf_gpio_pin_dir_set(motorPin4, NRF_GPIO_PIN_DIR_OUTPUT);
// Enter main loop.
for (;;)
{
uint8_t str1[1] = "1";
uint8_t str2[1] = "2";
uint8_t str3[1] = "3";
uint8_t str4[1] = "4";
switch(step_number){
case 0:
err_code1 = app_timer_start(timer_step1, APP_TIMER_TICKS(200, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(err_code1);
err_code2 = app_timer_stop(timer_step2);
APP_ERROR_CHECK(err_code2);
err_code3 = app_timer_stop(timer_step3);
APP_ERROR_CHECK(err_code3);
err_code4 = app_timer_stop(timer_step4);
APP_ERROR_CHECK(err_code4);
ble_nus_string_send(&m_nus, str1, strlen((char*)str1));
break;
case 1:
err_code1 = app_timer_stop(timer_step1);
APP_ERROR_CHECK(err_code1);
err_code2 = app_timer_start(timer_step2, APP_TIMER_TICKS(200, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(err_code2);
err_code3 = app_timer_stop(timer_step3);
APP_ERROR_CHECK(err_code3);
err_code4 = app_timer_stop(timer_step4);
APP_ERROR_CHECK(err_code4);
ble_nus_string_send(&m_nus, str2, strlen((char*)str2));
break;
case 2:
err_code1 = app_timer_stop(timer_step1);
APP_ERROR_CHECK(err_code1);
err_code2 = app_timer_stop(timer_step2);
APP_ERROR_CHECK(err_code2);
err_code3 = app_timer_start(timer_step3, APP_TIMER_TICKS(200, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(err_code3);
err_code4 = app_timer_stop(timer_step4);
APP_ERROR_CHECK(err_code4);
ble_nus_string_send(&m_nus, str3, strlen((char*)str3));
break;
case 3:
err_code1 = app_timer_stop(timer_step1);
APP_ERROR_CHECK(err_code1);
err_code2 = app_timer_stop(timer_step2);
APP_ERROR_CHECK(err_code2);
err_code3 = app_timer_stop(timer_step3);
APP_ERROR_CHECK(err_code3);
err_code4 = app_timer_start(timer_step4, APP_TIMER_TICKS(200, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(err_code4);
ble_nus_string_send(&m_nus, str4, strlen((char*)str4));
break;
}
step_number++;
if(step_number > 3){
step_number = 0;
}
power_manage();
}
}
Probably I am doing Something wrong with the timer, because when I modify it and decide to use it with a led for testing like in the tutorial, the motor makes noise but doesn't move and the led works.
If someone can help, it's been hours I am on this problem and I can't find my mistakes.