collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'  (Lida 5536 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Olá.

Fui atacado por um quadrilema.

Andei a escavar por bibliotecas para controlo de steppers e encontrei 3 coisas:

1 - a bibliotecas d Arduino
2 - outra chamada StepperLab3
3 - outra chamada AccelStepper

A primeira parece servir apenas para movimentos sem aceleração. A segunda funciona bem (com aceleração) mantendo o motor a fazer o necessário mesmo enquanto o processador faz coisas como escrever numa matriz de leds 64X8. A terceira tem igualmente aceleração mas só funciona se o processador não se 'distrair' muito em coisas como escrever na matriz de leds.

A segunda biblioteca apenas suporta controladores de stepper a 4 fios (ligações entre o processador e o driver). A terceira suporta 2 e 4 fios (além de outros).

Nos forae AccelStepper confirma-se que o processador não se pode distrair praticamente nada e os testes que fiz à StepperLab3 revelam que se pode distrair mesmo muito executando sem qualquer soluço aquilo que tem 'em mãos'. Um movimento de A para B com actualização da matriz de LEDs soluça pr'a catano no AccelStepper e rigorosamente nada no StepperLab3 mesmo que actualizado de forma exageradíssima .

Pensei usar um LCD mas no fórum da AccelStepper informam igualmente que é distracção a mais.

Nestes caldinhos não entra a função delay() que parece ter má fama.

Para além das referidas não encontro mais nenhuma livraria.

Neste momento estou a usar um driver baseado no L298N (4 fios) e estou a tentar usar o tal AccelStepper para poder usar um Microstep Driver (2 fios) parece-me que baseado num  tal TB6600.

Haverá uma 4ª livraria?

Obrigado
SC

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #1 em: 10 de Dezembro de 2018, 09:19 »
Esses problemas de bloqueios significa que algo ai nesse processo nao estara bem feito.
No que tenho ideia dos steppers, o processamento necessario é pouco, o necessario é cumprir os tempos de actuacao correctos. Isso tera de ser feito com interrupts com a prioridade necessaria.

Se mesmo assim eu estiver errado e ja estiver supostamente tudo bem, outra sugestao que posso dar é equacionar usar um MCU especifico para cada funcao.
Depois podes comunicar por porta serie, i2c, spi, pinos, etc..


Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #2 em: 10 de Dezembro de 2018, 10:39 »
Assim de repente pelo google encontro https://github.com/laurb9/StepperDriver, que segundo a descrição:
Citar
Non-blocking mode (yields back to caller after each pulse)

Hoje em dia já não se justifica continuar a usar o LM298. Tens drivers como o DRV8825 ou o A4988 que se podem comprar por 1€ e são muito superiores  (microstepping, proteção, limitação de corrente).
Também encontras shields baratos para 4 modulos ("CNC Shield"), simples, já com modulos ou até com o arduino, tudo a preços muito em conta. Ou então se quiseres mais poder de pocessamento, tens os "Kit RAMPS" para impressoras 3D com capacidade para mais motores e Arduino MEGA, também em conta: sem LCD ou com LCD.

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #3 em: 10 de Dezembro de 2018, 12:48 »
Ainda não tinha tropeçado no driver do github. Obrigado. Parece promissor.

Já tinha encomendado drivers DRV8825 / A4988 mas ainda não chegaram.

Amanhã tentarei usar essa biblioteca com este driver ...

https://github.com/DFRobot/DFRobotMediaWikiMarkDown/wiki/TB6600_Stepper_Motor_Driver_SKU__DRI0043

... mesmo fazendo de conta que está lá um dos que estão na biblioteca.

Se conseguir movimento sempre vou adiantando até que cheguem os novos drivers.

Abraço
SC

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #4 em: 11 de Dezembro de 2018, 17:30 »
OK. Ou há qualquer coisa que me escapa ou ...

Se usar a livraria StepperLab3 ...
http://interface.khm.de/index.php/lab-log/arduino-stepperlab3-motor-library/

... eu consigo o que quero:

The library functions are attached to an interrupt process what allows an accurate speed control and a non blocking behavior. If you tell the motor to go to a certain position this is done in the background while you can do other things in your code

Não tenho, de momento, forma de experimentar esta livraria com dois motores mas parece-me que desta forma só devo conseguir controlar um motor:

Keep in mind that the library is using ATMEGAs timer1 and the corresponding interrupt. Some other libraries or arduino functions might work not correct.

Esta livraria permite lançar um movimento, permitindo ao MCU fazer outras coisas e interromper o movimento a qualquer altura se necessário.

Continuam, então, então duas porras:

1 - Não consigo fazer o mesmo nem com a livraria da GitHub
2 - O driver StepperLab3 usa 4 saídas do MCU  (2 bobinas 2 polaridades), provavelmente limitativa a prazo.

O driver GitHub tem um modo chamado nonblocking que faz algo parecido com o que pretendo mas o timming do avanço (steps) do motor depende enormemente da cadência em que determinada função é invocada. Não parece, portanto, haver realmente independência entre o timming do avanço do motor e o timming do código.

Usar um MCUs para controlar cada motor poderá ser uma solução mas parece-me que, se continuo dependente dos timmings de execução do código não poderei desviar a atenção do MCU para a recepção de dados (de um eventual 'master') porque isso afectará a cadência de avanço do motor. A livraria GitHub permite duas formas de controlar o motor: deixando o MCU pendurado (no motor) até que o movimento acabe ou, alternativamente,  pela via do nonblocking. No primeiro caso não poderei interromper o movimento porque a execução do código só prossegue quando o movimento do motor chegar ao fim não podendo assim receber uma ordem de paragem precoce. No segundo, poderei parar o motor a qualquer momento mas a cadência do movimento fica dependente da cadência dos loops do código (comunicações, etc).

Pelo andar da carruagem sou capaz de ficar limitado a drivers (hardware) de entradas a 4 pinos. Ainda assim deverei ter que usar múltiplos MCUs.

O que pretendo fazer não implica timming precisos como, por exemplo, fazer uma circunferência precisa com 2 steppers X e Y. Bastara um movimento de cada vez e, havendo simultaneidade, não há grande exigência de coordenação. Haverá, incontornavelmente, necessidade de interromper a qualquer momento.

Abraço
SC

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #5 em: 11 de Dezembro de 2018, 17:44 »
Clarificaçao, o https://github.com é um serviço de repositorio de codigo de projectos, não é o autor da biblioteca.

https://github.com/laurb9/StepperDriver esta biblioteca parece ser criada por um user laurb9, de nome Laurentiu Badea
https://github.com/DFRobot/DFRobotMediaWikiMarkDown/wiki/TB6600_Stepper_Motor_Driver_SKU__DRI0043 esta é feita pela DFRobot

"Cada qual a seu dono" ;)


O que nao estou a perceber é se dizes que StepperLab3 faz o que queres, porque nao usas entao?

> No segundo, poderei parar o motor a qualquer momento mas a cadência do movimento fica dependente da cadência dos loops do código (comunicações, etc).

Se esta do "Laurentiu Badea" também é non-blocking, o que impede de não dar para fazer o mesmo? Não dá para dizer quantos passos podes correr ou a velocidade que deve correr?


Podias partilhar algum codigo exemplo?

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #6 em: 11 de Dezembro de 2018, 20:08 »

O que nao estou a perceber é se dizes que StepperLab3 faz o que queres, porque nao usas entao?


De acordo com o que expliquei antes, porque preferia usar um que ocupasse apenas dois pinos. Este ocupa 4.

Se esta do "Laurentiu Badea" também é non-blocking, o que impede de não dar para fazer o mesmo? Não dá para dizer quantos passos podes correr ou a velocidade que deve correr?


É non-blocking mas não corre independentemente.


Este, é 'blocking':

https://github.com/laurb9/StepperDriver/blob/a8b8d9d9ece0a73dee1a2b51215cfde465aca646/examples/AccelTest/AccelTest.ino

Não avança enquanto não acabar de fazer isto:

 stepper.startRotate(360);

Este é 'non-blocking'.

https://github.com/laurb9/StepperDriver/blob/a8b8d9d9ece0a73dee1a2b51215cfde465aca646/examples/NonBlocking/NonBlocking.ino

A pré-ordem de arranque é dada aqui:

stepper.startMove(100 * MOTOR_STEPS * MICROSTEPS);

Mas os steps são executados, um a um, aqui:
unsigned wait_time_micros = stepper.nextAction();

.. a cada volta do loop() dá mais um passo até se acabarem os que foram especificados em stepper.startMove(...)

Há sempre a hipótese de eu ter qualquer coisa baralhada, mas fiz testes directamente no código de exemplo da biblioteca.

Para ficar com um pouco mais de espaço de manobra, vou transferir o processo do Nano para o Mega. Vou voltar a testar o StepperLab3 mas com dois motores embora me pareça que só tenho um driver. Testo um de cada vez tendo dois a correr no PCU.

SC

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #7 em: 11 de Dezembro de 2018, 20:39 »
Ao instalar sobre o Mega o shield com a parafernália de pinos, reparei que na traseira desse shield os pinos do jumper de selecção da alimentação entravam em contacto com a blindagem da tomada USB. Meti lá um plástico grosso.

Safei-me.

:)


Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.480
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #8 em: 11 de Dezembro de 2018, 21:07 »
https://github.com/laurb9/StepperDriver/blob/a8b8d9d9ece0a73dee1a2b51215cfde465aca646/examples/NonBlocking/NonBlocking.ino

A pré-ordem de arranque é dada aqui:

stepper.startMove(100 * MOTOR_STEPS * MICROSTEPS);

Mas os steps são executados, um a um, aqui:
unsigned wait_time_micros = stepper.nextAction();

.. a cada volta do loop() dá mais um passo até se acabarem os que foram especificados em stepper.startMove(...)

Há sempre a hipótese de eu ter qualquer coisa baralhada, mas fiz testes directamente no código de exemplo da biblioteca.

ah ja percebi!
Acho que tens duas maneiras de usar:
- o teu codigo tambem tem de ser nao bloqueante, e colocado dentro onde diz // other code here
Nao podes usar delays, nao podes usar loops a esperar por mensagem, etc.
So pode ser codigo que faz alguma coisa e retorna o mais rapidamente ao loop.

Isto tecnicamente a funcionar assim, no limite terias de ver quantas intrucoes tens disponivel para correr no MCU ate teres de correr novamente o loop para fazer a activacao dos pinos com o menor atraso ( jitter, neste caso ) possivel.

- outra hipotese, seria colocar esse codigo numa interrupcao regular com o timer e corre-la com prioridade.
mas a biblioteca pode nao estar preparada para isso e causar problemas.

Eu escolheria a primeira hipotese.. Fazer o meu codigo nao bloqueante tambem e correr no loop.

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #9 em: 11 de Dezembro de 2018, 23:27 »
Ok. Encalhei mas avancei mais um bocado.

Não consegui pôr a funcionar no Mega (Atmega2560 chinês - pelo menos é o que lá diz). Tudo o que tinha feito funcionava à excepção da livraria StepperLab3. Os mesmos pinos e driver funcionavam movimentando o motor com a livraria da Arduino.

Repus no Nano e voltou a funcionar.

Citar
outra hipotese, seria colocar esse codigo numa interrupcao regular com o timer e corre-la com prioridade

Parece-me que é isso que está feito na dita livraria.

Aqui está um vídeo com a coisa a funcionar. Reparem que o Nano escreve furiosamente no array de LEDs enquanto o motor dá 1 volta completa, com aceleração e desaceleração, alternadamente para cada lado.



Amanhã volto à carga. É pena que esta livraria não trabalhe com drivers de 2 vias (direction/advance). Vou ver se encontro drivers para motores mais potentes com este tipo de entrada.

Abraço
SC

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #10 em: 12 de Dezembro de 2018, 10:55 »
Acho que no teu caso o problema é mesmo o código do display que deve ser bloqueante, e a bibliotecas para steppers não estão preparadas para esse caso, excepto a  StepperLab3 porque usa um interrupt do timer.


A solução mais simples e para ficares com mais possibilidades era alterar o código do display para também ser não bloqueante (trocar os delays() por outros métodos).
Por enquanto está a dar problemas com as bibliotecas de steppers, amanha pode ser com outra.

Outra alternativa é alterar o StepperLab3 para suportar controladores de steppers STEP/DIR, que é relativamente fácil de fazer pelo que vi do código, se quiseres posso fazer uma tentativa.
Mas não te livras da grande limitação dessa biblioteca que é só suportar um motor.


Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #11 em: 13 de Dezembro de 2018, 02:12 »
OK. Sendo teimoso, testei ainda a possibilidade de usar dois motores com a biblioteca StepperLab3  e nada. Aparentemente, o último motor a configurar é o que funciona. Não funcionam 2.

Entretanto descobri outra coisa interessante. A livraria usa dois pinos de PWM que, ligados às entradas enable do driver permitem modular a potência do motor. Isto é interessante.

Reconfigurei as coisas, liguei o array de LEDs aos pinos 2, 3 e 4, liguei o driver do motor aos pinos:

motor 7 e 8
pwm 9 e 10 (a biblioteca usa estes e não são configuráveis a não ser se marretar o código dela coisa que não me apetece)
motor 11 e 12

Fiz testes com este driver L298N:



... e tudo funciona inclusive a regulação de potência.

Embora me parecesse que por esta via podia ficar um bocado limitado na escolha de drivers para os motores, estive a pensar que é capaz de haver 'conversores' de 4 fios para 2 fios (Direction/Step).

O próximo passo será o de testar comunicações.

Como alguém sugeriu, um Nano é tão barato que dedicar um Nano a cada motor não é doloroso. A ideia neste momento é testar a comunicação entra dois Nanos para que um envie, para execução, instruções ao que directamente controla o motor, cada motor. Veremos se o Nano consegue receber dados sem baralhar os movimentos do motor. Volto a frisar que o momento em que o motor arranca não é crítico, critico é haver distúrbios enquanto o motor está em movimento.

Em princípio daria jeito usar I2C na intercomunicação entre o Nano controlador geral e os Nanos dos motores. Devo vir a substituir o array de LEDs por um LCD mas tal nem é muito importante nos Nanos dedicados aos motores. Tenho impressão que todos os LCDs que aqui tenho são I2C e não quero atascar a porta I2C tanto mais que ela parece não poder ser simultaneamente slave (recepção de instruções para o motor) e master (para o LCD). É capaz de fazer mais sentido usar apenas o monitor série do compilador para debug do Nano controlador do motor.


Por hoje já chega, amanhã haverá mais.

Abraço
SC.

Offline SerraCabo

  • Mini Robot
  • *
  • Mensagens: 1.051
    • Serra Cabo
Re: Bibliotecas para arduino e drivers de stepper - o problema da 'distracção'
« Responder #12 em: 14 de Dezembro de 2018, 12:12 »
Na imagem, ao centro, está o Nano 'mastar' que despeja via I2C uma contagem para o Nano à esquerda ('slave') que escreve no display e controla o motor. Até agora tudo funciona bem. O motor continua a funcionar sem solavancos.



Falta agora programar para que o slave possa responder ao master. Veremos o que acontece.

Usei este código, adaptado ao meu caso:

https://www.instructables.com/id/I2C-between-Arduinos/

Abraço
SC