2 Motores + Joystick
Dependencies: X_NUCLEO_IHM01A1 TextLCD
Fork of HelloWorld_IHM01A1_2Motors_mbedOS by
main.cpp
- Committer:
- digo1234
- Date:
- 2018-05-29
- Revision:
- 61:b7ef7d06c57b
- Parent:
- 60:9f4d34edef70
File content as of revision 61:b7ef7d06c57b:
/**
******************************************************************************
* @file main.cpp
* @author Davide Aliprandi, STMicroelectronics
* @version V1.0.0
* @date October 14th, 1025
* @brief mbed test application for the STMicroelectronics X-NUCLEO-IHM01A1
* Motor Control Expansion Board: control of 2 motors.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 1025 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
/* mbed specific header files. */
#include "mbed.h"
/* Helper header files. */
#include "DevSPI.h"
/* Component specific header files. */
#include "L6474.h"
#include <list>
/* includes para os lcds */
#include "TextLCD.h"
/* definindo apertado e solto para lcd */
#define apertado 1
#define solto 0
/* Definitions ---------------------------------------------------------------*/
/* Number of steps. */
#define STEPS 3101
/* Delay in milliseconds. */
#define DELAY_1 20
#define DELAY_2 101
#define DELAY_3 1010
/* Speed in pps (Pulses Per Second).
In Full Step mode: 1 pps = 1 step/s).
In 1/N Step Mode: N pps = 1 step/s). */
#define SPEED_1 1300
#define SPEED_2 1300
/* Variables -----------------------------------------------------------------*/
DigitalIn fim_curso_X (PD_2);
DigitalIn fim_curso_Y (PC_11);
DigitalIn fim_curso_Z (PC_8);
DigitalOut solenoide (PB_15);
Serial pc(USBTX, USBRX);
/* LCD */
I2C i2c_lcd(D14,D15); // sda, scl
TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD20x4); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type
int menu=0;
int menu_memoria=0;
//float xmenu=1.0, ymenu=2.0, zmenu=3.0;
int inicial= 1;
int pisca =0;
float i=0.0;
/* FIM LCD */
AnalogIn eixo_X(A2);
AnalogIn eixo_Y(A3);
AnalogIn eixo_ZU(A0);
AnalogIn eixo_ZD(A1);
DigitalIn botao1 (PC_1); //1
DigitalIn botao2 (PC_0); //2
DigitalIn botao3 (PC_10); //3
DigitalIn botao4 (PC_12); //4
DigitalIn emergencia(PC_4);// butão de emergencia
float x;
float y;
float w;
float u;
float zu;
float zd;
float a;
float pos;
float sp;
float vc;
int Dir_X;
int Dir_Y;
int Dir_Z;
int segu_fim_curso;
int count;
int dif_posX1;
int dif_posY1;
int dif_posZ1;
int dif_posX2;
int dif_posY2;
int dif_posZ2;
int dif_posX3;
int dif_posY3;
int dif_posZ3;
int listaX[20];
int listaY[20];
int listaZ[20];
int listaCola[20];
int index = 0;
bool flagX1=0;
bool flagY1=0;
int safe = 0;
int safe_emergencia = 0;
int safe_menu = 0;
int safe_eixoY = 0;
unsigned int minspeed = 1300;
//int step = 0x08;
unsigned int speed1;
unsigned int speed2;
unsigned int speed3;
//unsigned int pos3;
/* Motor Control Component. */
L6474 *motor1;
L6474 *motor2;
L6474 *motor3;
/* Main ----------------------------------------------------------------------*/
// função de correção de passos
int correcao_passo (int passo){
int passo_verdade;
if (passo != 0){
passo_verdade = passo/1.0892 - 15,56;
}
else {
passo_verdade = 0;
}
return (passo_verdade);
}
// função salva posição
void salva_posicao(){
listaX[index] = motor2->get_position();
listaY[index] = motor1->get_position();
listaZ[index] = motor3->get_position();
for (int j=0; j<=index; j++) {
printf("posX%d %d: \r\n", j+1, listaX[j]);
printf("posY%d %d: \r\n", j+1, listaY[j]);
printf("posZ%d %d: \r\n", j+1, listaZ[j]);
printf("Cola? :entre %d e %d %d \r\n", j+1,j, listaCola[j]);
}
index = index+1;
wait_ms(DELAY_2);
}
// função percorre caminho
void vai_caminho_desejado (int listapontosX[20], int listapontosY[20], int listapontosZ[20], int listapontosCola[20], int index_local) {
int PYatual = motor1->get_position();
int PXatual = motor2->get_position();
int PZatual = motor3->get_position();
int calcdeltaX = correcao_passo(listapontosX[0] - PXatual);
int calcdeltaY = correcao_passo(listapontosY[0] - PYatual);
int calcdeltaZ = correcao_passo(listapontosZ[0] - PZatual);
if (calcdeltaZ > 0) {
motor3->move(StepperMotor::FWD, calcdeltaZ);
motor3->wait_while_active();
}
else {
motor3->move(StepperMotor::BWD, -calcdeltaZ);
motor3->wait_while_active();
}
if (calcdeltaX >= 0 and calcdeltaY >= 0 ) {
motor2->move(StepperMotor::FWD, calcdeltaX);
motor1->move(StepperMotor::FWD, calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX >= 0 and calcdeltaY < 0 ) {
motor2->move(StepperMotor::FWD, calcdeltaX);
motor1->move(StepperMotor::BWD, -calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX < 0 and calcdeltaY >= 0 ) {
motor2->move(StepperMotor::BWD, -calcdeltaX);
motor1->move(StepperMotor::FWD, calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX < 0 and calcdeltaY < 0 ) {
motor2->move(StepperMotor::BWD, -calcdeltaX);
motor1->move(StepperMotor::BWD, -calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
printf("O for vai rodar: %d \r\n", index_local-1);
for (int i = 1; i< index_local ; i++) {
if (i==index_local-1){
solenoide.write(0);
}
if (listapontosCola[i] == 0){
printf("solenoide desliga %i \r\n",listapontosCola[i]);
solenoide.write(1);
}
else {
printf("solenoide liga %i \r\n",listapontosCola[i]);
solenoide.write(0);
}
calcdeltaX = correcao_passo(listapontosX[i] - listapontosX[i-1]);
calcdeltaY = correcao_passo(listapontosY[i] - listapontosY[i-1]);
calcdeltaZ = correcao_passo(listapontosZ[i] - listapontosZ[i-1]);
if (calcdeltaZ > 0) {
motor3->move(StepperMotor::FWD, calcdeltaZ);
motor3->wait_while_active();
}
else {
motor3->move(StepperMotor::BWD, -calcdeltaZ);
motor3->wait_while_active();
}
if (calcdeltaX >= 0 and calcdeltaY >= 0) {
motor2->move(StepperMotor::FWD, calcdeltaX);
motor1->move(StepperMotor::FWD, calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX >= 0 and calcdeltaY < 0) {
motor2->move(StepperMotor::FWD, calcdeltaX);
motor1->move(StepperMotor::BWD, -calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX < 0 and calcdeltaY >= 0) {
motor2->move(StepperMotor::BWD, -calcdeltaX);
motor1->move(StepperMotor::FWD, calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
if (calcdeltaX < 0 and calcdeltaY < 0) {
motor2->move(StepperMotor::BWD, -calcdeltaX);
motor1->move(StepperMotor::BWD, -calcdeltaY);
motor2->wait_while_active();
motor1->wait_while_active();
}
}
}
int main()
{
/*----- Initialization. -----*/
/* Initializing SPI bus. */
DevSPI dev_spi(D11, D12, D13);
/* Initializing Motor Control Components. */
motor1 = new L6474(D2, D8, D7, D9, D10, dev_spi);
motor2 = new L6474(D2, D8, D4, D3, D10, dev_spi);
motor3 = new L6474(D2, D8, D5, D6, D10, dev_spi);
if (motor1->init() != COMPONENT_OK) {
exit(EXIT_FAILURE);
}
if (motor2->init() != COMPONENT_OK) {
exit(EXIT_FAILURE);
}
if (motor3->init() != COMPONENT_OK) {
exit(EXIT_FAILURE);
}
//ligando lcd
lcd.setBacklight(TextLCD::LightOn);
lcd.setCursor(TextLCD::CurOff_BlkOff);
//abrindo menu inicial lcd
lcd.cls();
lcd.setAddress(3,0);
lcd.printf("MENU PRINCIPAL");
lcd.setAddress(0,2);
lcd.printf("1-SALVAR PONTOS");
lcd.setAddress(0,3);
lcd.printf("2-INICIAR PROGRAMA");
printf("programa rodando \r\n");
while(true) {
if (!botao1 && !botao2 && !botao3 && !botao4 && !emergencia){
safe = 0;
}
solenoide.write(1);
count = count +1;
//printf("programa rodando \r\n");
// Leitura analógica
u = eixo_X.read();
w = eixo_Y.read();
zu = eixo_ZU.read();
zd = eixo_ZD.read();
sp = botao1.read();
vc = botao2.read();
if (count == 50) {
//printf("programa rodando \r\n");
printf("u =%f \r\n\n", u);
wait_ms(DELAY_1);
count = 0;
}
// Movimentando eixo Z cima caso botão 1 apertado
if (zu >0.7 && !fim_curso_Z ) {
motor3->run(StepperMotor::FWD);
segu_fim_curso = 1;
Dir_Z = 1;
wait_ms(DELAY_1);
}
// Movimentando eixo Z baixo caso botão 2 apertado
else if (zd >0.7 && !fim_curso_Z ) {
motor3->run(StepperMotor::BWD);
segu_fim_curso = 1;
Dir_Z = 0;
wait_ms(DELAY_1);
}
// Parando eixo Z caso botão 1 e 2 liberado
else /*(zu< 0.7 && zd < 0.7 )*/{
motor3->hard_stop();
wait_ms(DELAY_1);
if (fim_curso_Z && segu_fim_curso==1) {
printf("Fim de curso Z apertada \r\n");
if (Dir_Z == 1){
motor3->move(StepperMotor::BWD, 1000);
motor3->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
if (Dir_Z == 0){
motor3->move(StepperMotor::FWD, 1000);
motor3->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
}
}
// Movimentando eixo Y duas direções com joystick
// Movimentando eixo Y fwd
if (u>0.820 && !fim_curso_Y && !botao1 && !botao2 && zu<0.7 && zd<0.7) {
printf("motor y indo para frente");
motor1->run(StepperMotor::FWD);
Dir_Y = 1;
segu_fim_curso = 1;
wait_ms(DELAY_1);
}
// Movimentando eixo Y bwd
else if(u<0.65 && !fim_curso_Y && !botao1 && !botao2 && zu<0.7 && zd<0.7) {
printf("motor y indo para tras");
motor1->run(StepperMotor::BWD);
Dir_Y = 0;
segu_fim_curso = 1;
wait_ms(DELAY_1);
}
// parando eixo Y
else {
motor1->hard_stop();
wait_ms(DELAY_1);
if (fim_curso_Y && segu_fim_curso==1 ) {
printf("Fim de curso Y apertada \r\n");
if (Dir_Y == 1){
motor1->move(StepperMotor::BWD, 1000);
motor1->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
if (Dir_Y == 0){
motor1->move(StepperMotor::FWD, 1000);
motor1->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
}
}
// Movimentando eixo X duas direções com joystick
// Movimentando eixo X fwd
if (w>0.80 && !fim_curso_X) {
motor2->run(StepperMotor::BWD);
Dir_X = 1;
segu_fim_curso = 1;
wait_ms(DELAY_1);
}
// Movimentando eixo X Bwd
else if(w<0.60 && !fim_curso_X) {
motor2->run(StepperMotor::FWD);
Dir_X = 0;
segu_fim_curso = 1;
wait_ms(DELAY_1);
}
// parando eixo X
else{
motor2->hard_stop();
wait_ms(DELAY_1);
if (fim_curso_X && segu_fim_curso==1) {
printf("Fim de curso X apertada \r\n");
if (Dir_X == 1){
motor2->move(StepperMotor::FWD, 1000);
motor2->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
if (Dir_X == 0){
motor2->move(StepperMotor::BWD, 1000);
motor2->wait_while_active();
segu_fim_curso = 0;
wait_ms(DELAY_1);
}
}
}
// botão de emergencia apertado
if(emergencia && safe_emergencia==0){
lcd.cls();
lcd.setAddress(0,1);
lcd.printf("BOTAO DE EMERGENCIA");
lcd.setAddress(4,2);
lcd.printf("PRESSIONADO");
safe_emergencia=1;
}
if(!emergencia && safe_emergencia==1){
lcd.cls();
lcd.setAddress(0,0);
lcd.printf("PONTOS PERDIDOS");
lcd.setAddress(0,1);
lcd.printf("MAQUINA REINICIANDO");
wait(2);
safe_emergencia=0;
NVIC_SystemReset();
}
// Menus
if (menu == 0 && safe_menu == 0 ){
lcd.cls();
lcd.setAddress(3,0);
lcd.printf("MENU PRINCIPAL");
lcd.setAddress(0,2);
lcd.printf("1-SALVAR NOVOS PONTOS");
lcd.setAddress(0,3);
lcd.printf("2-INICIAR PROGRAMA");
safe_menu = 1;
}
if (menu == 1 && safe_menu == 0 ) {
lcd.cls();
lcd.setCursor(TextLCD::CurOff_BlkOff);
lcd.setAddress(0,0);
lcd.printf("1-SALVAR PONTO %i",index+1);
lcd.setAddress(0,1);
lcd.printf("2-VOLTAR");
lcd.setAddress(0,2);
lcd.printf("3-CANCELAR ");
lcd.setAddress(0,3);
lcd.printf("4-CONCLUIR ");
safe_menu = 1;
}
if (menu == 2 && safe_menu == 0 ) {
lcd.cls();
lcd.setCursor(TextLCD::CurOff_BlkOff);
lcd.setAddress(0,0);
lcd.printf("QUER APLICAR COLA ");
lcd.setAddress(0,1);
lcd.printf("ENTRE PONTO %i E %i",index,index-1);
lcd.setAddress(0,3);
lcd.printf("1-SIM ");
lcd.setAddress(8,3);
lcd.printf("2-NAO");
safe_menu = 1;
}
if (menu == 3 && safe_menu == 0 ) {
lcd.cls();
lcd.setAddress(2,0);
lcd.printf("TEM CERTEZA QUE");
lcd.setAddress(2,1);
lcd.printf("DESEJA CANCELAR?");
lcd.setAddress(1,2);
lcd.printf("PONTOS IRAO APAGAR");
lcd.setAddress(1,4);
lcd.printf("1-SIM");
lcd.setAddress(10,4);
lcd.printf("2-NAO");
safe_menu = 1;
}
if (menu == 4 && safe_menu == 0 ){
lcd.cls();
lcd.setAddress(0,0);
lcd.printf("PONTOS SALVOS");
lcd.setAddress(0,2);
lcd.printf("1-INICIAR PROGRAMA");
lcd.setAddress(0,3);
lcd.printf("2-VOLTAR A SALVAR");
safe_menu = 1;
}
if (menu == 5 && safe_menu == 0 ){
lcd.cls();
lcd.setAddress(0,0);
lcd.printf("SALVE SEU PONTO");
lcd.setAddress(0,1);
lcd.printf("DE RETIRADA");
lcd.setAddress(0,4);
lcd.printf("1-SALVAR PONTO");
safe_menu = 1;
}
if (menu ==6 && safe_menu == 0) {
lcd.cls();
lcd.setAddress(0,1);
lcd.printf("NAO HA PONTOS SALVOS");
wait(2);
menu=0;
}
if (menu == 7 && safe_menu == 0) {
lcd.setAddress(0,1);
lcd.printf("AGUARDE...");
safe_menu =1;
}
// botao1
if (botao1 && menu == 0 && safe == 0){
for (int i=0; i<21;i++){
listaX[i] = 0;
listaY[i] = 0;
listaZ[i] = 0;
}
index = 0;
menu = 0;
menu = 1;
safe =1;
safe_menu = 0;
}
if (botao1 && menu == 1 && safe == 0) {
if (index<1){
listaCola[index-1]=0;
salva_posicao();
}
else {
menu = 2;
salva_posicao();
}
safe = 1;
safe_menu = 0;
}
if (botao1 && menu == 2 && safe == 0) {
listaCola[index-1]=1;
for (int a=0; a<=index; a++){
printf("cola : %i \r\n", listaCola[a]);
}
menu = 1;
safe = 1;
safe_menu = 0;
}
if (botao1 && menu == 3 && safe == 0) {
for (int i=0; i<21;i++){
listaX[i] = 0;
listaY[i] = 0;
listaZ[i] = 0;
}
index = 0;
lcd.cls();
lcd.setAddress(0,1);
lcd.printf("OPERACAO CANCELADA!");
lcd.setAddress(0,2);
lcd.printf("PONTOS APAGADOS!");
wait(2);
menu = 0;
safe = 1;
safe_menu = 0;
}
if (botao1 && menu == 4 && safe == 0) {
menu = 5;
safe = 1;
safe_menu = 0;
}
if (botao1 && menu == 5 && safe == 0) {
salva_posicao();
listaCola[index]=0;
lcd.cls();
lcd.setAddress(0,1);
lcd.printf("AGUARDE...");
vai_caminho_desejado(listaX, listaY, listaZ, listaCola, index);
menu = 0;
safe = 1;
safe_menu = 0;
}
// botao2
if (botao2 && menu == 0 && safe == 0) {
if (listaX[1]==0&& listaY[1]==0 && listaZ[1]==0) {
menu = 6;
}
else {
vai_caminho_desejado(listaX, listaY, listaZ, listaCola, index);
menu = 0;
}
safe = 1;
safe_menu = 0;
}
if (botao2 && menu == 1 && safe == 0) {
listaX[index] = 0;
listaY[index] = 0;
listaZ[index] = 0;
listaCola[index]=0;
index = index - 1;
menu = 1;
if (index<0){
index=0;
menu=0;
}
safe = 1;
safe_menu = 0;
}
if (botao2 && menu == 2 && safe == 0) {
listaCola[index-1]=0;
for (int a=0; a<=index; a++){
printf("cola : %i \r\n", listaCola[a]);
}
menu=1;
safe = 1;
safe_menu = 0;
}
if (botao2 && menu == 3 && safe == 0) {
menu = 1;
safe = 1;
safe_menu = 0;
}
if (botao2 && menu == 4 && safe == 0) {
menu = 1;
safe = 1;
safe_menu = 0;
}
// botao3
if (botao3 && menu == 1 && safe == 0) {
menu = 3;
safe = 1;
safe_menu = 0;
}
// botao4
if (botao4 && menu == 1 && safe ==0) {
menu = 4;
safe = 1;
safe_menu = 0;
}
}
}
