Meta #881
FechadaFirmware LARC 2018
Descrição
Utilizando o firmware preparado para a RoboCUP 2018 fazer as adaptações para o uso da nova placa-mãe e correção e melhora de erros encontrados no código.
Arquivos
Atualizado por Sérgio Gabriel dos Santos Dias há aproximadamente 6 anos
- Arquivo cube placa 2018.JPG cube placa 2018.JPG adicionado
Conseguimos atualizar boa parte dos pinos, exceto esses:
-PA9 USB_OTG_FS_VBUS
-PA10 USB_OTG_FS_ID
-PA11 USB_OTG_FS_DM
-PA12 USB_OTG_FS_DP
-PA13 SYS_JTMS.SWDIO
-PD10 CB
-PA4 D_CUR
-PC0 BAT_REF
-PE5 DAH
-PE2 ID_Button
-PD4 Reset(CS43L22)
-PD5 USB_overcurent
que estão declarados na imagem a seguir:
![cube](cube placa 2018.jpg)
Atualizado por Anônimo há aproximadamente 6 anos
tivemos dificuldade porque não encontramos nenhuma classe ou arquivo que define-se a pinagem.
Atualizado por João Guilherme Oliveira Carvalho de Melo há aproximadamente 6 anos
- Arquivo PE5-DAH.PNG PE5-DAH.PNG adicionado
- Arquivo PE5-DAH(1).PNG PE5-DAH(1).PNG adicionado
- Arquivo PE2-ID_Button.PNG PE2-ID_Button.PNG adicionado
- Arquivo PE2-ID_Button(1).PNG PE2-ID_Button(1).PNG adicionado
- Arquivo PC0-BAT_REF.PNG PC0-BAT_REF.PNG adicionado
- Arquivo PC0-BAT_REF(1).PNG PC0-BAT_REF(1).PNG adicionado
- Arquivo PC0-BAT_REF(2).PNG PC0-BAT_REF(2).PNG adicionado
- Arquivo PD10-CB.PNG PD10-CB.PNG adicionado
- Arquivo PD10-CB(1).PNG PD10-CB(1).PNG adicionado
Muito bom galera, espero que vocês consigam finalizar até a competição!
Sobre os pinos, não sei se entendi muito bem o problema, mas provavelmente vocês não encontraram porque a maioria desses pinos (PA9, 10, 11, 12, 13, PD4 E PD5) são de funções que já vêm implementadas na biblioteca "Standard Peripherals" e não nas bibliotecas do robô em si. Se olharem no esquemático da placa mãe, vão ver que eles não são utilizados nela. Acho que o melhor seria checar se o cube já não tem algo pronto que implementa essas funções de USB, Reset e conexão JTAG/SWD, que com certeza tem.
Olhando o firmware que usamos na Robocup e o esquemático da placa mãe nova, com exceção dos pinos que mencionei acima, consegui encontrar o seguinte:
- PA4 D_CUR:
Saída do INA169 conectado no motor do drible, não sei se realmente há algo implementado a respeito desse pino pois antes era utilizado outro sensor de corrente com pinagem diferente. Tentem ver a implementação usada nos pinos de saída dos outros INAs.
- PC0 BAT_REF:
Pino ADC que mede a voltagem da bateria. No firmware antigo, as definições a respeito deste pino estão em "adc.h" e "adc.cpp" e ele é chamado na "Robo.cpp":
![](PC0-BAT_REF.PNG)
Em adc.cpp:
![](PC0-BAT_REF(1).PNG)
![](PC0-BAT_REF(2).PNG)
- PE5 DAH:
De acordo com o esquemático da placa mãe nova esse pino é referente ao controle do motor do drible, ou seja, necessita apenas de um PWM. No firmware da placa antiga esses comandos estão implementados no pino PB15 em "dibre.cpp" e "dibre.h":
![](PE5-DAH.PNG)
![](PE5-DAH.PNG)
- PE2 ID_Button:
Botão que controla o ID. Na placa mãe antiga, o controle do ID era feito de forma diferente, vejam como funciona o novo seletor de ID para fazer a implementação deste botão. No firmware da placa mãe antiga as definições deste pino estão em "Switch.h" e "bsp.cpp":
![](PE2-ID_Button.PNG)
![](PE2-ID_Button(1).PNG)
- PD10 CB:
Comando de chute baixo. O pino está declarado em "Robo.cpp" e a implementação pode ser encontrada um pouco abaixo no mesmo código:
![](PD10-CB.PNG)
![](PD10-CB.PNG)
- Sobre os pinos de chute (PB0, PD8 e PD10):
Na placa de chute nova os pinos CT (que na placa nova vira Charge Enable, isso também deve ser modificado) e CA estão trocados em relação a placa antiga e é MUITO IMPORTANTE que isso seja levado em conta ao escrever o novo código. Na versão do código utilizada na Robocup (a branch é "placa-chute18") essa atualização já está feita, portanto, a configuração correta é a seguinte:
PB0: Chute Alto (CA)
PD8: Chute Baixo (CB, como já está)
PD10: Charge Enable (CE, ou Charge_Enable, algo do tipo)
O pino de Charge Enable deve receber sinais na forma de degrau para que a placa funcione, para a competição implementamos da seguinte forma:
O pino era mantido em HIGH e a cada 6 segundos ou quando um chute era executado, o pino recebia um RESET e um SET. Isso vocês podem encontrar no código da branch que citei acima em "main.cpp" e "robo.cpp".
Espero ter ajudado e qualquer coisa podem perguntar.
Atualizado por Sérgio Gabriel dos Santos Dias há aproximadamente 6 anos
Obrigado João, em relação aos pinos do Standard Peripheral a gente tinha pensado que poderia ser da biblioteca já feita mesmo com o cube. Esses pinos que foram trocados a gente não sabia e vai mudar também
Atualizado por Onias Castelo Branco há aproximadamente 6 anos
- Arquivo discovery_usb.PNG discovery_usb.PNG adicionado
Eai galera. Mais informação sobre esses pinos que eu coloquei no projeto do cube que não estão no firmware: Eles estão sendo usados sim, mas pela discovery. São pinos que já tem uma função pre-programada neles, que se a gnt alterar pode atrapalhar funções que a discovery já tem (como passar o código pro robo) ou o contrario (uns anos trás um dos pinos do encoder estava junto com um ci usado na discovery, ai ele não conseguia corrente suficiente pra funcionar.)
-PA9 USB_OTG_FS_VBUS
-PA10 USB_OTG_FS_ID
-PA11 USB_OTG_FS_DM
-PA12 USB_OTG_FS_DP
Eles são usados para comunicação com o cabo usb que a gnt coloca no computador, alterando esses pinos a gente não poderia usar o robo enquanto está conectado no pc (não daria pra fazer debug)
-PA13 SYS_JTMS.SWDIO
Esse pino é responsavel por passar o código pro microcontrolador.
-PD4 Reset(CS43L22)
o CS43L22 é um componente que converte sinal digital para sinal analogico, pra ser usado com o conector de fone de ouvido que vem na discovery. Esse pino está reservado porque o dando um sinal de Reset nesse CI ele não pode atrapalhar nenhuma funcionalidade do robo, pois esse CS43L22 usa muitos pinos que a gnt também usa
-PD5 USB_overcurent
É um medidor de corrente que chega do USB. Pra medidas de precaução, eu deixei ele quieto.
Abaixo tem um print do esquemático da discovery que pode ajudar no entendimento. Ele está no final do user manual dela (https://www.st.com/content/ccc/resource/technical/document/user_manual/70/fe/4a/3f/e7/e1/4f/7d/DM00039084.pdf/files/DM00039084.pdf/jcr:content/translations/en.DM00039084.pdf)
![discovery_usb](discovery_usb.PNG)
Atualizado por Anônimo há aproximadamente 6 anos
- Arquivo firmware.jpg firmware.jpg adicionado
Ta complicado isso de CT ta trocado com CA da placa mãe nova em relação a antiga, a gente ta confuso em relação a isso e pensamos em deixar do modo como ta na branch NewBoard (roboime-firmware) considerando que onde tem CT no firmware na verdade é CA e vice versa. Os outros pinos estavam corretos depois que verificamos os locais que o joão falou e falta definir o botão pro id. Também estamos com um problema de que esta aparecendo no código na linha 191 como descrito na figura abaixo em que ele não identifica spi apesar de ta definido no código.
![problema no firmware](firmware.jpg)
Atualizado por Sérgio Gabriel dos Santos Dias há aproximadamente 6 anos
Provavelmente o erro está no SPI2, do MPU e do cartão SD, pois comparando com uma versão anterior placa-chute18 não apresentava erro e só tinha o SPI da NRF além de estar declarado na bsp.cpp, enquanto no NewBoard está declarado na main. Não sabemos se tem alguma diferença nesse modo de declarar os pinos.
Atualizado por Onias Castelo Branco há aproximadamente 6 anos
Eai galera. Sobre o erro de compilação. Achei aqui como resolver e já commitei. O problema estava na verdade na declaração do SPI do NRF. Antes estava assim o codigo:
IO_Pin_STM32 SPI1_SCK_PIN(IO_Pin::IO_Pin_Mode_SPECIAL, GPIOA, GPIO_Pin_5, GPIO_PuPd_NOPULL, GPIO_OType_PP, GPIO_AF_SPI1);
IO_Pin_STM32 SPI1_MISO_PIN(IO_Pin::IO_Pin_Mode_SPECIAL, GPIOA, GPIO_Pin_6, GPIO_PuPd_NOPULL, GPIO_OType_PP, GPIO_AF_SPI1);
IO_Pin_STM32 SPI1_MOSI_PIN(IO_Pin::IO_Pin_Mode_SPECIAL, GPIOA, GPIO_Pin_7, GPIO_PuPd_NOPULL, GPIO_OType_PP, GPIO_AF_SPI1);
IO_Pin_STM32 NRF24_SS_PIN(IO_Pin::IO_Pin_Mode_OUT, GPIOD, GPIO_Pin_0, GPIO_PuPd_NOPULL, GPIO_OType_PP);
IO_Pin_STM32 NRF24_CE_PIN(IO_Pin::IO_Pin_Mode_OUT, GPIOC, GPIO_Pin_12, GPIO_PuPd_NOPULL, GPIO_OType_PP);
IO_Pin_STM32 NRF24_IRQN_PIN(IO_Pin::IO_Pin_Mode_IN, GPIOC, GPIO_Pin_5, GPIO_PuPd_UP, GPIO_OType_OD);SPI_STM32 spi_nrf(SPI1, NRF24_SS_PIN, SPI_BaudRatePrescaler_32);
NRF24L01P nrf24(spi, NRF24_SS_PIN, NRF24_CE_PIN, NRF24_IRQN_PIN);
Como o código antigo só usava uma SPI, a declaração do NRF24L01P era nrf24(spi, blablabla). Só que dessa vez a declaração do spi do nrf era spi_nrf.
Modificando isso o código funciona. Coloquei também de volta no arquivo bsp.cpp, junto com as outras declarações.
Atualizado por Onias Castelo Branco há aproximadamente 6 anos
Adicionei mais uma parte de código que checa se o display e o mpu-9250 estão funcionando. Peço que testem ai.
Atualizado por Anônimo há aproximadamente 6 anos
- Arquivo firmware_co.jpg firmware_co.jpg adicionado
- Prioridade alterado de Normal para Imediata
não estamos conseguindo resolver esse problema ![codigo](firmware_co.jpg) que diz que não é possível abrir o arquivo stm32f4_flash.ld, o código é da branch NewBoard do github da roboime em roboime_firmware.
Atualizado por Luiz Renault Leite Rodrigues há aproximadamente 6 anos
Algum dos veteranos pode ajudar?
Atualizado por Onias Castelo Branco há aproximadamente 6 anos
- Arquivo linker_script.PNG linker_script.PNG adicionado
Hugo, o problema nesse caso é que o atollic não consegue achar o arquivo do linker script. Na imagem mesmo que vc colocou o endereço que ele está buscando é o do meu computador. C:\Users\Onias\... Ou seja, você tem que editar nas configurações do projeto onde ele procura pelo arquivo e colocar o endereço que está no seu computador. Em project -> properties. Ai no icone grifado voce seleciona o endereço desejado.
![](linker_script.PNG)
Sobre o linker em si, nele ficam as informações sobre o espaço na memória que sera destinado as partes do seu código. Por isso ele é importante. A ide pega o esta no linker na hr de passar pra placa e coloca as coisas que ela gerou nos espaços de memoria que estao escritos no linker.
Atualizado por Anônimo há aproximadamente 6 anos
O robô ja esta funcionando o drible e os outros motores de movimento alem do chute, mas um problema que estamos enfrentando agora é que ao fazer o elo-mec test o robô funciona normalmente após o inicio da comunicação (informada pela luz azul do led), mas o problema é no intervalo de tempo entre o robô ter sido ligado até antes do início da comunicação em que o drible é acionado sozinho. Um problema é que não foi definido na pinagem da placa mãe o DAL (drible Low), apenas foi definido o DAH (drible high). para tentar resolver o problema tentei primeiro manda sinal 0 no DAH no inicio da main:![firmware SSL](1.jpg) mas não deu certo continuo acionando sozinho o drible antes do início da comunicação. outra coisa que tentei foi colocar no while(1) da main, antes do interrupt ![firmware SSL](2.jpg) mas também não funcionou. Se alguem souber como resolver, acredito que após resolver esse problema a intel ja vai poder testar em campo com a placa mãe nova os robôs.
Link para o firmware mais atualizado https://github.com/Hugogomes9/firmwarenovo/tree/quase
Atualizado por Luiz Renault Leite Rodrigues há aproximadamente 6 anos
Como é a tabela verdade de acionamento do drible? Quais sinais e quais funções?
Atualizado por Onias Castelo Branco há aproximadamente 6 anos
- Arquivo Modulo_motor_diag.PNG Modulo_motor_diag.PNG adicionado
Luiz Renault Leite Rodrigues escreveu:
Como é a tabela verdade de acionamento do drible? Quais sinais e quais funções?
Estou analisando aqui o modulo de motor.
![](Modulo_motor_diag.PNG)
O 4427 recebe x e manda x pro 7389. O MBL e o MBH do drible são VCC, MAL é GND e o MAH é o PWM.
Para o lado B, chega no 7389 vcc e vcc, logo, a saida MB é gnd.
Para o lado A, chega no 7389 gnd e PWM. Com isso abre o transistor de cima e a saída fica o PWM do MAH. Antes de receber o PWM o sinal está com um pull-down por conta do ir4427.
Com essa análise não consegui entender. Errei alguma coisa?
Atualizado por Anônimo há aproximadamente 6 anos
Segue a tabela verdade:![esquematico proveniente do esquematico da placa mãe](3.jpg)
MAH (que é nomeado de DAH na verdade)=PWM
MAL=0
MBH=1
MBL=1
e o desenho da ponte H: ![esquematico proveniente do esquematico da placa mãe](4.jpg)
S1 = MAH
S2 = MAL
S3 = MBH
S4 = MBL
concluimos apos uns testes que basta a discovery inicializar, que o robô começa a funcionar normalmente tanto movimento quanto drible e chute, mas no intervalo de tempo entre ligar o robô e a discovery inicializar o drible é acionado sozinho sem comando da intel, e é acionado na velocidade maxima.
Atualizado por Anônimo há aproximadamente 6 anos
Segue a tabela verdade:![esquematico proveniente do esquematico da placa mãe](3.jpg)
MAH (que é nomeado de DAH na verdade)=PWM
MAL=0
MBH=1
MBL=1
e o desenho da ponte H: ![esquematico proveniente do esquematico da placa mãe](4.jpg)
S1 = MAH
S2 = MAL
S3 = MBH
S4 = MBL
concluimos apos uns testes que basta a discovery inicializar, que o robô começa a funcionar normalmente tanto movimento quanto drible e chute, mas no intervalo de tempo entre ligar o robô e a discovery inicializar o drible é acionado sozinho sem comando da intel, e é acionado na velocidade maxima.
Tambem testamos ligar o robô sem discovery, e o drible fica acionado sozinho, concluindo que o pino flutuando ta sendo interpretado como 0 pelo modulo de motor
Atualizado por Anônimo há aproximadamente 6 anos
A única parte que a priori esta faltando no firmware é resolver o problema do drible inicializar sozinho, tentamos no firmware resolver o problema mas não conseguimos. Uma solução proposta foi a de colocar o pino PE5 em pullup através de um resistor through hole, para que o drible não se inicialize sozinho antes de a discovery inicializar. Major o senhor acha que vale a pena aplicar essa solução?
Atualizado por Luiz Renault Leite Rodrigues há aproximadamente 6 anos
Acho que vale a pena sim. USe um valor de 10 a 100K.
Atualizado por Anônimo há aproximadamente 6 anos
IMPORTANTE:
Um problema que a intel estava tendo ao testar dois robôs em campo, era que a comunicação com 1 deles ficava ruim enquanto que com o outro robô ficava boa, esse problema ocorria ao tentar comunicar com os dois robôs ao mesmo tempo, inicialmente um robô nem se mexia enquanto que o outro se movia normalmente, pensamos primeiro que o problema era o nrf24l01, entretanto ao testar apenas o robô que não se movia junto com o outro, o robô funcionou normalmente tanto o elo-mec test quanto o zigue-zague.
Depois pensamos que o problema era com o código da intel, então em uma parte do código da intel em que havia um delay, foi reduzido esse tempo e depois disso ao testar os dois robôs juntos o que não se movia antes começou a se mover junto com outro entretanto ainda sim com problemas de comunicação pois o robô não seguia as ordens perfeitamente diferentemente do outro, tentamos reduzir ainda mais o delay porem começou a falhar mais ainda a comunicação. Após nada disso da certo recorremos ao Gustavo, e ele resolveu o problema.
O problema na verdade encontrava-se no firmware, especificamente nessa parte do codigo: no arquivo nrf24l01.cpp ![firmware SSL](2.jpg) o problema que havia aqui era que no parâmetro no_ack (no acknowledge) estava recebendo valor 0, ou seja estava ativado o ACK, que foi modificado nessa parte:![firmware SSL](1.jpg) , o ACK é um sinal que é enviado de transceptor para transceptor em uma comunicação, e o problema da comunicação com o robô era que o transmissor enviava um sinal ACK para o receptor (robô) e o transmissor( placa de comunicação da intel) ficava esperando receber o sinal ACK de volta para enviar uma ordem, o que causava problema de o robô não obedecer a intel no momento em que um comando era enviado.
Atualizado por Anônimo há aproximadamente 6 anos
- Situação alterado de Em andamento para Resolvida
Atualizado por Anônimo há aproximadamente 6 anos
Um outro erro que cometi no código foi na questão da troca de id do robô pelo botão do display, o problema é que da maneira como fiz inicialmente, ao clicar o botão do display, aparecia que tinha mudado o id e funcionava normalmente caso tivesse sido mudado primeiro no robô e depois no computador da inteligência, mas caso a inteligência muda-se primeiro, e logo após muda-se no robô a comunicação não iniciava, sendo necessário a inteligência mudar o id para outro qualquer e depois novamente colocar o id do robô (de alguma maneira isto reiniciava a comunicação) a maneira correta de chamar função que muda o id é como se segue abaixo na figura: ![problema no firmware](1.JPG) antes não havia nesses metodos a parte do nrf24 para reiniciar a comunicação após mudança de id
Atualizado por Anônimo há aproximadamente 6 anos
- Situação alterado de Resolvida para Fechada