Page 1
Universidade Estadual de Campinas
Faculdade de Engenharia Mecanica
ES952 - Trabalho de Graduacao II
Relatorio de Atividades
Desenvolvimento de um cambio automatico parabicicletas
Autor:
Paulo Silveira Machado
RA: 024831
Orientador:
Prof. Dr. Luiz Otavio Saraiva Ferreira
Faculdade de Engenharia Mecanica
2º Semestre/2011
Page 2
SUMARIO
Sumario
1 Resumo 3
2 Introducao 4
2.1 Analise do problema fısico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Revisao bibliografica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Premissas do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Desenvolvimento das partes 7
3.1 Bancada experimental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Circuito de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.1 Servo Motor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.2 Display LCD 16x2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.3 Reed Switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.4 Push buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.5 Microcontrolador (MCU) . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4 Algoritmo de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4.1 Estrutura do Codigo . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 Testes e Resultados 20
4.1 Teste Preliminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.1 Debugando o codigo . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.2 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Teste de Bancada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2.1 Resolucao de problemas . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2.2 Detalhes da Implementacao . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.3 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5 Conclusoes 30
6 Anexos 31
6.1 Custos do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2 Codigo Fonte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2.1 API da Biblioteca BikeTransmission . . . . . . . . . . . . . . . . . . 31
6.2.2 Implementacao da Biblioteca BikeTransmission . . . . . . . . . . . . 32
6.2.3 Programa principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.2.4 Calculo de Relacao entre marchas . . . . . . . . . . . . . . . . . . . 37
6.2.5 Calculo de Filtro RC . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
– 1 –
Page 3
LISTA DE FIGURAS
7 Referencias 40
Lista de Figuras
1 Componentes de uma transmissao ciclıstica . . . . . . . . . . . . . . . . . . 4
2 Visao traseira de engrenamentos de um derailleur. . . . . . . . . . . . . . . 5
3 Bancada experimental construıda para o TG I . . . . . . . . . . . . . . . . . 7
4 Bancada pronta para teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5 Componentes da montagem do circuito de controle . . . . . . . . . . . . . . 9
6 Trocador manual antes da adaptacao . . . . . . . . . . . . . . . . . . . . . . 10
7 Sequencia de adaptacao do atuador . . . . . . . . . . . . . . . . . . . . . . . 10
8 Servo Futaba S3004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
9 Display LCD 16x2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
10 O Reed Switch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
11 Filtro passa-baixa passivo acoplado ao reed switch . . . . . . . . . . . . . . 13
12 Resistor pull-down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
13 Arduino Duemilanove . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
14 Circuito completo do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . 16
15 Logica do programa de automacao da transmissao . . . . . . . . . . . . . . 17
16 Representacao UML da biblioteca BikeTransmission . . . . . . . . . . . . . 19
17 Plataforma de testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
18 Esquema de configuracao do display LCD . . . . . . . . . . . . . . . . . . . 21
19 Saıda serial com informacao de debug. . . . . . . . . . . . . . . . . . . . . . 23
20 Ranhura da polia do cabo de acionamento . . . . . . . . . . . . . . . . . . . 24
21 Detalhe da construcao da gaiola do derailleur. . . . . . . . . . . . . . . . . . 25
22 Tentativa de adaptacao de derailleur. . . . . . . . . . . . . . . . . . . . . . . 25
Lista de Tabelas
1 Custos do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
– 2 –
Page 4
1 Resumo
1 Resumo
Um trabalho de graduacao em Engenharia de Controle e Automacao deve, idealmente,
abranger as tres grandes areas que originam a formacao[1]: Engenharia Eletrica (eletronica,
processamento de sinais, circuitos eletricos e teoria de controle, etc); Engenharia Mecanica
(dinamica, modelagem de sistemas, etc); e a Computacao (automacao, controle discreto,
etc). Este trabalho tenta, modestamente, resvalar cada uma destas areas e honrar a
formacao recebida.
A ideia deste projeto surgiu das observacoes diarias de ciclistas e do uso da bicicleta,
onde grande parte das pessoas nao utiliza de forma eficiente as marchas de suas bicicletas.
Estas parecem ser complicadas (mountain bikes simples possuem pelo menos 18 marchas),
de difıcil manejo, configuracao e manutencao. Assim como em uma transmissao auto-
motiva, maus habitos na sua operacao – esticar marchas, manter a mao apoiada sobre a
alavanca, entre outros – causam desgaste precoce dos componentes, esforcos desnecessarios
(neste caso para ciclista) e ate risco de seguranca.
O benefıcio primordial de qualquer automacao (i.e. retirar do usuario o controle ou
parte do controle sobre o sistema que interage) e a melhora no fluxo do processo devido
ao aumento do controle sobre o sistema. Os resultados deste benefıcio sao, em alto nıvel,
o aumento da qualidade, repetibilidade e uniformidade, aplicacao de estrategias otimas de
controle e simplicidade na interacao com utilizador.
Este relatorio apresenta o desenvolvimento e resultados do trabalho proposto e es-
tudado na primeira disciplina de Trabalho de Graduacao: a construcao de um prototipo
funcional de um sistema de troca de marchas automatizados para bicicletas convencio-
nais. Neste primeiro trabalho foram construıdas as base teoricas e ferramentais para a
construcao de um prototipo funcional: construcao da bancada experimental; desenvolvi-
mento da logica; e estudo de solucoes existentes. Ou seja, dados os objetivos do projeto –
software de controle, circuito de controle, atuador mecanico e a juncao destes no prototipo
– apresenta-se o caminho percorrido ate o objetivo e os resultados alcancados.
O documento foi estruturado de forma a descrever o problema de engenharia, as
alternativas consideradas, escolhas e desenvolvimento de cada parte funcional do prototipo
final, testes e resultados.
– 3 –
Page 5
2 Introducao
2 Introducao
A tonica no inıcio do desenvolvimento deste projeto deu-se na escolha entre a solucao
usando controle ou usando automacao. A solucao de controle – atraves do modelamento
matematico do sistema fısico – e mais elegante, porem seu desenvolvimento e mais com-
plexo e depende de um sinal contınuo. A automacao – analise dos sinais e programacao
de reacoes – nao e tao elegante e eficiente, porem seu desenvolvimento e mais simples e
pode ser orientada a eventos. A resposta, seja ela qual for, passa obrigatoriamente pela
analise do problema fısico.
2.1 Analise do problema fısico
A transmissao ciclıstica convencional e apresentada na figura 1. Podemos observar os
Figura 1: Componentes de uma transmissao ciclıstica
principais componentes da transmissao, sendo na ordem em que a energia e transmitida:
o pedivela transmite o torque aplicado aos pedais pelo ciclista as coroas dianteiras, que
movimentam a corrente, que por sua vez, transmite a energia as coroas traseiras (o con-
junto destas e chamado de cassete, nome que sera usado no documento), conectadas a
roda traseira, gerando a movimento.
– 4 –
Page 6
2.1 Analise do problema fısico
A relacao de transmissao e determinada pela quantidade de dentes da coroa tra-
seira e dianteira de um engrenamento. Assim, a troca de marcha (i.e. da relacao de
transmissao) e realizada pela mudanca no engrenamento da corrente com as coroas, tanto
dianteiras quanto traseiras. Portanto uma bicicleta possui tantas marchas quanto forem
a multiplicacao da quantidade de coroas no cassete pelas coroas dianteiras, por exemplo,
quando ha tres coroas dianteiras e seis coroas no cassete, a transmissao possui 3x6=18
marchas. A mudanca no engrenamento e realizado pelos derailleurs1, que mediante ao
deslocamento longitudinal ao eixo da roda forca a corrente ser engrenada em outra coroa.
No desenvolvimento do prototipo (tratado como uma prova de conceito), por simpli-
cidade, a atuacao foi limitada nos componentes da parte traseira da transmissao, ou seja,
apenas no derailleur traseiro. O esquema da figura 2 apresenta a visao traseira do derail-
leur e tres exemplos de engrenamento. Na figura 2 temos, respectivamente, engrenado uma
Figura 2: Visao traseira de engrenamentos de um derailleur.
marcha lenta (alto torque e baixa velocidade), uma marcha media e uma marcha rapida
(baixo torque e alta velocidade). O movimento da gaiola (componente do derailleur) se da
pela sua estrutura de bracos paralelos do derailleur e e acionado via cabo, com retorno por
mola. O cabo e controlado pelo ciclista, geralmente por um sistema alavanca montado no
guidao, mas que tambem assume diversas outras formas, sempre com o objetivo de puxar
ou soltar o cabo, e genericamente chamado trocador (shifter). O trocador movimenta o
cabo em estagios discretos, sendo cada estagio desse correspondente ao engrenamento em
1Derailleur e um termo frances que pode ser traduzido como o ato do descarrilamento de um trem na
ferrovia. O dispositivo ganhou esse nome devido a semelhanca com o evento (”descarrila”a corrente).
– 5 –
Page 7
2.2 Revisao bibliografica
uma coroa diferente.
O ciclista controla a pedalada de acordo com seu gosto, terreno e velocidade. Logo,
quando esta em um aclive, procura puxar o cabo de forma a engrenar as marchas mais
lentas, e o oposto quando enfrenta um declive ou um terreno que ofereca menos resistencia,
como por exemplo asfalto plano. O gosto e biotipo do ciclista determinam o ponto da troca
de marcha pela velocidade da cadencia (velocidade da pedalada). Por exemplo, o sete vezes
campeao do Tour de France, Lance Armstrong, prefere pedalar em alta velocidade (picos
de 100-110 RPM), enquanto que outros ciclistas de sua categoria dificilmente alcancam 90
RPM de cadencia2 . Ciclistas amadores possuem limites bem inferiores. Portanto, uma
premissa basica do projeto e a possibilidade do ajuste sobre os limites para a troca de
marcha.
O resultado da analise do problema fısico levou a escolha pela solucao de automacao,
preterindo o controle. A decisao baseou-se na observacao de que o sistema de uma trans-
missao de bicicleta, considerando as possıveis alternativas para a forma de aquisicao de
dados de custo acessıvel, e orientado a eventos e baseado em estados discretos.
2.2 Revisao bibliografica
Uma ampla revisao bibliografica foi realizada na primeira parte deste Trabalho de Gra-
duacao, e nao sera repetida neste relatorio. Vale ressaltar porem, que pouca bibliografia
academica e produzida sobre o assunto. Por outro lado, o desenvolvimento comercial e
bastante prolıfico, havendo em torno de quatro ou cinco companhias multinacionais lide-
rando os mercados globais de componentes e diversos garagistas pensando e desenvolvendo
solucoes.
A maior dificuldade e como localizar documentacao sobre uma solucao tao especıfica.
A solucao foi a utilizacao de duas bases de patentes: USPTO[14] e EPO[10]. O criterio
de escolha utilizado para selecionar apenas os dois escritorios foi o fato de constituırem os
dois maiores mercados consumidores do mundo.
2.3 Premissas do projeto
Apos o estabelecimento do tipo de solucao e de alguns requisitos mınimos, quatro premissas
simples foram estabelecidas para o prototipo. Sao:
• Baixo custo
• Adaptabilidade ao sistema existente
• Possibilidade de configuracao de parametros
• Interface com usuario
2 http://www.trifuel.com/training/bike/cycling-cadence-and-pedaling-economy
– 6 –
Page 8
3 Desenvolvimento das partes
3 Desenvolvimento das partes
Nesta secao sao apresentadas as partes do projeto e como estas foram unidas. O desen-
volvimento deste projeto foi modular, o que permitiu na maior parte do tempo trabalhar
no hardware e no software de forma independente. As partes sao:
• Bancada experimental
• Circuito de controle
• Prototipo Completo
• Algoritmo de Controle
3.1 Bancada experimental
A bancada experimental e um dos produtos principais da primeira parte deste trabalho
de graduacao. Simular os sinais do sistema via algum tipo de software ou kit e uma opcao
menos desejavel, visto que o de desenvolvimento do projeto com base em um sistema real
nao se apresentou como uma proposta complicada ou muito cara. Desta forma, a solucao
elaborada no primeiro trabalho foi usar uma bicicleta convencional e adapta-la de forma
a criar uma bancada de testes. O resultado e apresentado na Figura 3. A bancada e uma
Figura 3: Bancada experimental construıda para o TG I
– 7 –
Page 9
3.2 Circuito de controle
meia bicicleta – com a parte traseira, onde estao os elementos da transmissao – onde foram
soldados apoios, possibilitando “pedalar no vazio” e realizar os testes do projeto em um
sistema real.
Foram diversos os problemas relativos a bancada, e surgiram no momento previo aos
testes, quando os componentes da transmissao foram montados. As pecas disponıveis nao
eram compatıveis (corrente curta, coroa dianteira nao casou com o corrente), o que causou
novos custos e atraso nos testes. Superados os percalcos, o resultado final e apresentado
na figura 4. Nesta montagem estao presentes, alem do sistema mecanico completo da
bicicleta, a montagem do servo motor e os ımas acoplados ao pedivela e a roda.
Figura 4: Bancada pronta para teste
3.2 Circuito de controle
O circuito de controle foi montado sobre uma placa de prototipacao (protoboard) e seu
esquema geral e apresentado na figura 5. Os componentes podem ser separados em tres
grupos funcionais: saıdas, controle e entradas. Nessa classificacao sao: saıdas, servo motor
e LCD (Liquid Crystal Display); controle, MCU (MicroControler Unit); e entradas os push
buttons e reed switch. Os componentes utilizados e detalhes da integracao sao descritos a
seguir.
– 8 –
Page 10
3.2 Circuito de controle
Figura 5: Componentes da montagem do circuito de controle
3.2.1 Servo Motor
O servo motor e o unico atuador deste projeto, sendo responsavel pela atuacao sobre o
cabo do derailleur e consequente troca de marchas. Duas perguntas foram elaboradas
para ajudar na definicao de um atuador: Qual a forma mais simples de atuar sobre um
cabo utilizando um motor rotativo? Qual tipo de motor e confiavel e facil de controlar?
A reposta, encontrada a partir do estudo realizado na primeira parte do trabalho de
graduacao, e o acoplamento de uma polia (atuador sobre cabo) a um servo motor.
O raio da polia foi dimensionado de tal forma que, dado que um servo motor rota-
ciona 180°, meia circunferencia da polia seja deslocamento suficiente para movimentar o
derailleur da menor a maior marcha. Assim, definimos o raio da polia (rpolia), o numero
de marchas (n) e o passo (p) como o deslocamento necessario do cabo de comando para a
mudanca de uma marcha consecutiva, de tal forma que:
2πrpolia2
= (n− 1)p
rpolia =(n− 1)p
π(1)
Para a bancada de testes, n=6 e p=3 mm. O raio ideal para a polia e:
rpolia =(6− 1)× 3
π= 4.77 mm (2)
Porem, este resultado nao foi utilizado, pois a construcao de uma polia foi preterida pela
adaptacao de um trocador manual (figura 6).
– 9 –
Page 11
3.2 Circuito de controle
Figura 6: Trocador manual antes da adaptacao
A polia interna deste trocador possui raio de 8.5 mm, o que por um lado aumenta
o intervalo de marchas disponıvel e a velocidade da troca (dada velocidade de rotacao
constante do servo), por outro aumenta o requisito de torque no eixo. A figura 7 mostram
a sequencia da adaptacao.
(a) Partes (b) Partes Montadas (c) Atuador Completo
Figura 7: Sequencia de adaptacao do atuador
Pequenos servos RC (motores destinados ao mercado de hobbistas) sao baratos,
faceis de encontrar, robustos e seu controle e feito por um sinal PWM. O servo motor
escolhido foi um Futaba S3004, visto na figura 8. O S3004 possui rolamentos de esferas no
eixo de saıda, e torque de 4.1kg-cm a 6 volts, o que no SI equivale a 4.1× 9.81× 10−2 =
0.4022 Nm.
– 10 –
Page 12
3.2 Circuito de controle
Figura 8: Servo Futaba S3004
Dois complicadores existem na utilizacao de servos motores[12], em relacao a seu
comportamento eletrico. O primeiro, como todo componente indutivo, sao os picos de
corrente a cada mudanca de posicao, que podem drenar toda corrente destinada ao con-
trolador. O segundo complicador e o ruıdo, tanto gerado pelo servo nas escovas do motor
DC, quanto captado pelo cabo de sinal – e comum ver um servo ”tremendo”quando em
repouso – pois o cabo do sinal PWM atua como uma antena. Para mitigar estes efeitos a
alimentacao do servo foi isolada da alimentacao do resto do prototipo. O unico cuidado
adicional e manter as referencias no mesmo potencial, ou seja, manter o terra do circuito
de controle e do servo no mesmo potencial.
3.2.2 Display LCD 16x2
Como o sistema propoe uma interface com o usuario, um display LCD foi escolhido para
executar este papel. A principal vantagem deste tipo de display e o baixo consumo de
energia, essencial em sistemas embarcados, devido a independencia de uma fonte de luz
propria. O tamanho de 16 caracteres e duas linhas e suficiente para mostrar as informacoes
de velocidade imediata, a marcha engatada e o valor da constante de ajuste, planejadas
para esta interface.
O display utilizado e um JHD-162a[3] de fabricante desconhecido e facilmente en-
contrado no mercado, visto na figura 9.
A montagem do display nao ofereceu nenhum problema, funcionando out of the box,
o que e creditado a fartura de boa documentacao encontrada na Internet.
– 11 –
Page 13
3.2 Circuito de controle
Figura 9: Display LCD 16x2
3.2.3 Reed Switch
A definicao e uso de elementos sensores foi um dos elementos chave deste projeto. Estes de-
veriam ser usados para a leitura de pulsos a cada revolucao da roda e do pedivela, gerando
as informacoes de velocidades, basica ao algoritmo de controle. As solucoes analisadas
foram:
• Sensor capacitivo
• Sensor indutivo
• Reed switch
• Sensor de efeito HALL
Os principais criterios de escolha, que permearam o projeto desde sua concepcao, foram
simplicidade e custo. O escolhido foi o reed switch, que oferece uma enorme margem
de vantagem nos criterios escolhidos, e ja e a implementacao padrao de computadores
ciclısticos.
Um reed switch e uma chave normalmente aberta constituıda de duas laminas ferro-
magneticas flexıveis, que sob influencia de um campo magnetico, fecha o contato. A figura
10 apresenta o conceito e um reed como os utilizados.
(a) Uma ampola reed e partes. (b) Contato fecha com influencia de campo
magnetico.
Figura 10: O Reed Switch.
– 12 –
Page 14
3.2 Circuito de controle
Um problema grave dos reed switch e o ruıdo gerado na sua operacao. Devido ao
bouncing [8] o sinal gerado precisa de um tratamento para que possa ser lido corretamente.
Foi considerado realizar o debounce do sinal de duas formas: via software; ou via hard-
ware. A primeira foi descartada pois as funcoes do programa responsaveis pelo calculo
de velocidade seriam rotinas de interrupcao, ou seja, eles devem ter uma execucao muito
breve, caso contrario podem afetar a contagem de tempo do sistema e uma funcao de
debounce em software envolve, inerentemente algum delay.
Figura 11: Filtro passa-baixa passivo acoplado ao reed switch
A alternativa foi implementar o debounce em hardware, utilizando um filtro passa-
baixa passivo, que usa apenas um resistor e um capacitor, de acordo com o esquema da
Figura 11. O ruıdo de um reed switch comum esta na faixa de 1500Hz a 2000Hz[8]. E
possıvel estimar a frequencia maxima (fmax) de ativacao dos reeds a partir de um limite
de velocidade da roda (vmax = 90km/h = 25m/s):
v = ωr = 2πfr ⇒ vmax = 2πfmaxr (3)
O diametro da roda com pneu foi medido em d=65cm = 0.65m. Portanto, para velocidade
maxima de 90 km/h:
fmax =vmax
πd=
25
π0.65= 12.243Hz (4)
Tomando a frequencia de corte (fc) dada pela relacao,
fc =1
2πτ, onde τ = RC (5)
igual a frequencia maxima (fmax), diversas combinacoes de resistores e capacitores sao
possıveis. Logo, o script 6.2.5 escrito em linguagem pyhton[13] foi usado para ajudar a
dimensionar os componentes, de acordo com o que foi adquirido (Sec. 6.1) e o que foi
obtido.
– 13 –
Page 15
3.2 Circuito de controle
3.2.4 Push buttons
Os push buttons tem a funcao de modificacao da constante de ajuste do sistema, incre-
mentado ou decrementando seu valor. Sao elementos bastante simples, que como os reed
switch, produzem ruıdo pelo fenomeno de bouncing. Porem como a sua aplicacao nao
e crıtica, nao houve a preocupacao em tratar o sinal, pois o funcionamento do sistema
praticamente nao e prejudicado por estas falhas.
Figura 12: Resistor pull-down
A unica observacao feita em relacao a montagem dos push buttons e a topologia pull-
down do resistor, mostrado na figura 12. Este dispositivo e usado para limitar a corrente
que passa do Vcc para o terra, e para garantir que o nıvel logico seja coerente quando a
chave conectada esta inativa, “puxando” a corrente para o terra. Tipicamente utiliza-se
valor de resistencia de 10kΩ, o que foi respeitado na montagem.
3.2.5 Microcontrolador (MCU)
Omicrocontrolador utilizado e um ATMega168 20PU do fabricante Atmel®. O ATMega168[2]
e um microcontrolador de 8 bits com 16K bytes de memoria de programa e clock de 20MHz
e arquitetura RISC. O ATMega168 possui diversos perifericos dentre os quais sao de inte-
resse para o projeto:
• 6 canais PWM
• 23 I/O programaveis (digitais e analogicos)
• Interrupcao e wake-up na borda de subida ou descida de sinal
• Interface serial para programacao
A utilizacao direta do microcontrolador requer diversos cuidados em relacao a sua
alimentacao, configuracao de pinagem e recursos. Qualquer desenvolvedor de sistemas
embarcados sabe que este tipo de cuidado toma grande quantidade de tempo e pode
ser fonte de infindaveis problemas. Como resolver problemas de natureza eletronica e
– 14 –
Page 16
3.3 Prototipo
configuracao de bits nao e o proposito deste trabalho, foi feita a escolha por uma plataforma
de prototipagem que resolve grande parte deste problemas: o Arduino[4][11].
O Arduino e uma plataforma de prototipagem open-source (hardware e software)
que utiliza microcontroladores Atmel Mega168, Mega328 e Mega1280. Alem dos recursos
providos pelo microcontrolador, sao embarcados conversor USB/Serial, tornando desne-
cessaria uma porta serial no PC de desenvolvimento, bournes para conexao dos pinos de
I/O, botao de reset, cristal oscilador externo e entrada de alimentacao. O circuito e capaz
de selecionar automaticamente qual fonte de alimentacao utilizar (USB ou fonte externa).
O modelo de escolhido para este trabalho foi o Duemilanove, que utiliza o micro-
controlador ATMega168, e pode ser visto na figura 13.
Figura 13: Arduino Duemilanove
A linguagem de programacao utilizada e o C/C++, sendo que o compilador utilizado
foi o GNU Compiler Collection, o GCC[7]. Uma das grandes vantagem da utilizacao
do GCC e ser multiplataforma, alem do fato de ser software livre. O Arduino provem
uma IDE e bibliotecas[5] para o desenvolvimento de aplicacoes, adicionais as bibliotecas
C fornecidas com o compilador[6], das quais foram utilizadas no projeto as bibliotecas
Servo e LiquidCrystal, responsaveis pela manipulacao de servo motores e display LCD,
respectivamente.
3.3 Prototipo
O circuito completo do projeto, conforme esquematizado na figura 5 e apresentado na
figura 14. O unico componente adicional e o potenciometro, usado para regular o contraste
do display LCD. Destaca-se na metade superior direita os circuitos para tratamento das
entradas (dois filtros passa-baixa e duas montagens de resistor pull-down).
– 15 –
Page 17
3.4 Algoritmo de controle
Figura 14: Circuito completo do Projeto
3.4 Algoritmo de controle
A logica do programa, elaborada ainda na primeira parte deste trabalho e que se manteve
fiel ao design original e apresentada na figura 15 e descrita a seguir.
Inicio: inıcio do programa.
Pedalando: recebe informacao da cadencia e se nula, significa que o ciclista nao esta
pedalando. Nesse caso, o sistema passa para o teste de bateria e atualizacao do
display. Caso contrario, segue para o passo seguinte, de leitura de velocidade.
Leitura de velocidade: armazena a leitura de velocidade instantanea do sensor de ve-
locidade da roda traseira.
Calcula limites: a partir de uma tabela de limites padrao e do valor da constante de
velocidade (variavel que armazena o valor do multiplicador dos limites, para ade-
quacao ao estilo de pedalada do ciclista), e calculado o limite de velocidade inferior
e superior para a marcha presente.
Velocidade alem do limite superior para a relacao: compara leitura de velocidade
da roda traseira com o calculo do limite superior de velocidade para a marcha.
Velocidade abaixo do limite inferior para a relacao: compara leitura de velocidade
da roda traseira com o calculo do limite inferior de velocidade para a marcha.
Proxima coroa disponıvel: checa se a coroa atual engrenada e a ultima (coroa com
menos dentes, ou seja, de maior velocidade).
Coroa anterior disponıvel: checa se a coroa atual engrenada e a primeira (coroa com
– 16 –
Page 18
3.4 Algoritmo de controle
mais dentes, ou seja, de maior torque).
Movimenta derailleur para proxima coroa: caso a velocidade seja maior que o li-
mite superior da coroa atual e exista a proxima coroa, o derailleur e movimentado
para engatar a coroa seguinte.
Figura 15: Logica do programa de automacao da transmissao
– 17 –
Page 19
3.4 Algoritmo de controle
Movimenta derailleur para coroa anterior: caso a velocidade seja menor que o li-
mite inferior da coroa atual e exista a coroa anterior, o derailleur e movimentado
para engatar a coroa anterior.
Checa bateria: testa a carga da bateria e armazena informacao. Esta e uma etapa muito
importante em qualquer dispositivo embarcado, pois e da bateria que vem a energia
necessaria ao funcionamento do sistema.
Atualiza display: atualizacao da interface com informacao de velocidade instantanea,
marcha engatada, e carga da bateria.
3.4.1 Estrutura do Codigo
A estrutura do codigo esta dividida entre uma biblioteca, onde foram modeladas classes
para a representacao do derailleur e da roda de bicicleta, o um programa principal. Esta
opcao se pauta em dois princıpios, um tecnico e outro filosofico, respectivamente: utilizar
a caracterıstica de representacao do mundo fısico oferecida pelo programacao orientada a
objetos; a posterior redistribuicao do codigo como software livre3, visando a expansao e
melhoria do projeto.
Fisicamente, os arquivos estao organizados:
BikeTransmission/
|-- BikeTransmission.cpp
|-- BikeTransmission.h
‘-- keywords.txt
principal/
‘-- principal.pde
Os arquivos BikeTransmission sao a interface e implementacao da biblioteca que
modela os elementos fısicos do projeto. O arquivo keywords.txt e o arquivo de configuracao
para o destaque das palavras chaves introduzidas pela biblioteca na IDE do Arduino. O
arquivo principal.pde e o programa principal onde a biblioteca do projeto e usada.
A biblioteca BikeTransmission modela basicamente duas classes que representam a
roda e o derailleur. Um diagrama UML das classes esta na figura 16 a seguir.
A roda traseira (RearWheel) possui um atributo representando o diametro da roda,
e um metodo para calcular a velocidade linear, alem do metodo construtor. O derailleur
possui dois metodos, um para obter a marcha engatada (get gear), e outro para selecionar
uma nova marcha (set gear). Utiliza o construtor padrao, pois nao ha configuracoes
especiais.
3Todo codigo fonte deste trabalho, inclusive este relatorio, esta disponıvel no site de hospedagem de
codigo github (https://github.com/paulomach/TG-II) sob a licenca GPL v3[9].
– 18 –
Page 20
3.4 Algoritmo de controle
Figura 16: Representacao UML da biblioteca BikeTransmission
O codigo integral esta nos Anexos, nas secoes 6.2.1, 6.2.2 e 6.2.3, que sao respecti-
vamente, API (Application Programming Interface), a implementacao da API e o codigo
do programa principal que utiliza a API. Os detalhes da implementacao estao descritos
na secao 4.2.3 Testes e Resultados e especialmente na secao 4.2.2, pois o desenvolvimento
do codigo foi indissociavel dos testes.
– 19 –
Page 21
4 Testes e Resultados
4 Testes e Resultados
4.1 Teste Preliminar
Para inıcio dos testes, antes de finalizada a bancada, um esquema de testes fısicos auxiliar
era necessario. O objetivo e de alguma forma obter os sinais que seriam obtidos pelo
sistema real, ou seja, gerar os acionamentos dos reed switch’s com as frequencias esperadas
para o sistema real.
Para satisfazer esse requisito de teste, uma plataforma foi desenvolvida utilizando
baterias, pequenos motores DC, potenciometros (para regulacao da tensao nos motores,
e logo sua velocidade), algumas pecas de LEGO® para a montagem, e um par de ımas
acoplados para o acionamento dos reed’s. A plataforma finalizada pode ser vista em acao
na figura 17.
Figura 17: Plataforma de testes
Na parte de tras, o par trancado vermelho e preto e o cabeamento de um reed,
enquanto que o protoboard branco no centro a esquerda e o circuito de controle da veloci-
dade do motor DC. Acoplado a polia de tras ha um pequeno ıma de neodımio (tambem
conhecido como ıma de terras raras), extraıdo de um disco rıgido. Este e um ıma poderoso
considerando seu tamanho, e gera o campo magnetico necessario a ativacao do reed a ate
aproximadamente 5 mm de distancia.
– 20 –
Page 22
4.1 Teste Preliminar
Essa montagem permitiu a geracao de um sinal em uma das duas entradas do sis-
tema, sendo que a segunda entrada foi gerada manualmente com outro ıma de neodımio.
As limitacoes desta montagem surgiram rapidamente. Gerar o sinal manualmente se mos-
trou pouco conveniente, pois e bastate difıcil manter um intervalo regular manualmente.
E visto que o potenciometro disponıvel se apresentou pouco amigavel, se comportando
mais como um interruptor do que como uma resistencia variavel, nao foi possıvel obter a
variacao na velocidade desejada.
4.1.1 Debugando o codigo
Para visualizar o funcionamento e debug do codigo, apenas observar a saıda do sistema
(movimentacao do servo motor) nao e suficiente. A primeira medida e a configuracao do
display LCD, mapeado como na figura 18, contendo as informacoes mais basicas para a
verificacao do sistema. A numeracao na figura e referente a posicao de cada caractere do
display. Um exemplo do mapeamento ja foi dado na figura 9.
Figura 18: Esquema de configuracao do display LCD
Este mapeamento e necessario para a codificacao do display, apresentado no trecho
do codigo a seguir.
1 . . .
2 // LCD i n i t i a l i z a t i o n
3 Liqu idCrysta l l cd ( 7 , 6 , 5 , 4 , 8 , 10 ) ;
4 . . .
5 // LCD s t a t i c s e t up
6 l cd . begin ( 16 ,2 ) ;
7 l cd . p r i n t ( ” s t a r t up . . . ” ) ;
8 de lay ( 2000 ) ;
9 l cd . c l e a r ( ) ;
10 l cd . p r i n t ( ”Vel : ” ) ;
11 l cd . setCursor ( 8 ,0 ) ;
12 l cd . p r i n t ( ”kmph” ) ;
13 l cd . setCursor ( 0 ,1 ) ;
14 l cd . p r i n t ( ”Marcha : ” ) ;
15 l cd . setCursor ( 10 ,1 ) ;
16 l cd . p r i n t ( ”K: ” ) ;
17 . . .
18 // Update LCD
19 void update l cd ( )
20 l cd . setCursor ( 4 ,0 ) ;
21 l cd . p r i n t ( ” ” ) ;
– 21 –
Page 23
4.1 Teste Preliminar
22 l cd . setCursor ( 4 ,0 ) ;
23 l cd . p r i n t ( wspeed ) ;
24 l cd . setCursor ( 7 ,1 ) ;
25 l cd . p r i n t ( gear ) ;
26 l cd . setCursor ( 12 ,1 ) ;
27 l cd . p r i n t ( K ) ;
28
29 . . .
O codigo da linha 3 cuida da instanciacao de um objeto da classe LCD, usando os
pinos listados para a comunicacao. Os comandos seguintes posicionam o cursor de acordo
com o mapeamento para entao escrever a string ou o valor (lcd.setCursor e lcd.print).
Ainda assim, para o debug do sistema mais informacao e necessaria. A opcao e a
utilizacao dos recursos de comunicacao serial do Arduino, que pode transmitir dados em
formato texto pela mesma porta USB usada para carregar e alimentar o sistema. Para
configurar e usar esta comunicacao, o codigo:
1 . . .
2 // Conf ig S e r i a l baud r a t e
3 S e r i a l . begin ( 9600 ) ;
4 . . .
5 /∗
6 ∗ S e r i a l debug ou tpu t r o u t i n e
7 ∗/
8 void upda t e s e r i a l ( )
9 i f ( debugLevel == 2)
10 S e r i a l . p r i n t ( ”Veloc idade : ” ) ; S e r i a l . p r i n t ( wspeed ) ;
11 S e r i a l . p r i n t l n ( ” kmph” ) ;
12 S e r i a l . p r i n t ( ”Marcha : ” ) ; S e r i a l . p r i n t l n ( gear ) ;
13 S e r i a l . p r i n t ( ”Tempo roda : ” ) ; S e r i a l . p r i n t ( wtime ) ;
14 S e r i a l . p r i n t l n ( ” ms” ) ;
15 S e r i a l . p r i n t ( ”Tempo cadenc ia : ” ) ; S e r i a l . p r i n t ( ctime ) ;
16 S e r i a l . p r i n t l n ( ” ms” ) ;
17 S e r i a l . p r i n t ( ”K: ” ) ; S e r i a l . p r i n t l n (K) ;
18 S e r i a l . p r i n t l n ( ”” ) ;
19
20
21 . . .
Na linha 3 e configurado o baud rate, que na comunicacao serial equivale a quantidade
de bits transferida por segundo. O terminal serial utilizado na leitura das mensagens
precisa ter o mesmo baud rate. A partir da linha 8 a rotina de comunicacao serial so
transmite caso uma flag seja configurada para tal.
Em qualquer parte do codigo pode ser adicionado um comando de impressao serial,
contendo o valor de uma variavel, uma informacao textual ou ambos. Um exemplo dos
das informacoes normalmente impressas na saıda serial esta na figura 19.
4.1.2 Resultados
Esta montagem preliminar foi util especialmente para a calibracao das entradas realizando
teste do debounce dos reed switch e botoes, redimensionando quando necessarios os capa-
citores e resistores da montagem. A geracao manual de um sinal mostrou-se inapropriada,
entao logo que possıvel, foi feita a montagem na bancada para testes reais.
– 22 –
Page 24
4.2 Teste de Bancada
Figura 19: Saıda serial com informacao de debug.
4.2 Teste de Bancada
A bancada da figura 4 foi testada e apos o primeiro startup, os sinais de entrada foram
adquiridos corretamente, e os sinais de saıda apresentados no display e no monitor serial
estavam coerentes. Porem um detalhe do mais importante falhou: mesmo com uma nova
marcha engatada, nenhum movimento foi observado no derailleur.
A conclusao e que o servo motor usado simplesmente nao possui torque suficiente
(a forca calculada para a combinacao motor-polia e 4.1kgf−cm0.85cm
= 4.824kgf) para enrolar o
cabo que movimenta o derailleur, o que e discutido a seguir.
Sao duas fontes de resistencia a este movimento, sendo a primeira o atrito do cabo
no conduıte, e a segunda e principal, a mola de retorno do derailleur. Tres alternativas
para contornar este problema foram estudadas, sendo:
1. Diminuir o raio da polia, minimizando o torque necessario no eixo do servo motor.
2. Redimensionar a mola de retorno do derailleur para um valor menor da constante
elastica.
3. Redimensionar o servo motor, ou seja, utilizar um que forneca maior valor de torque.
A primeira alternativa esbarrou em uma limitacao ferramental, sendo bastante com-
plicado aprofundar a ranhura (destacada na figura 20) da polia do trocador manual de
forma uniforme, isto e, de forma que o raio permanecesse com o mesmo valor sempre.
Manter o raio da polia uniforme e imprescindıvel pois o passo entre as coroas no
cassete sao constantes, ou seja, caso variavel o engate das marchas fica comprometido.
Sem uma forma de garantir a uniformidade, essa alternativa foi deixada de lado no curto
prazo.
Na consideracao da segunda alternativa, foi questionado o porque de um derailleur
possuir uma mola de retorno de constante elastica relativamente grande – infelizmente
– 23 –
Page 25
4.2 Teste de Bancada
Figura 20: Ranhura da polia do cabo de acionamento
nao havia forma de medir seu valor, e nao ha especificacao disponıvel pelo fabricante,
visto que constitui um dos segredos do projeto. O valor e tal que possa garantir do
derailleur a posicao mınima, nao importando as condicoes e configuracoes. Isto e, o
derailleur e uma peca mecanica que fica completamente exposta aos elementos, sendo que
seu funcionamento tem que ser garantido o mesmo estando este completamente limpo e
lubrificado, ou cheio de barro. Ha tambem o atrito no cabeamento, que esta sujeito a
mesma variacao de resistencia do derailleur.
A segunda consideracao e que, decidindo por uma intervencao na mola de retorno,
a construcao da gaiola do derailleur e projetada para nao ser desmontavel (detalhe da
figura 21), com rebites e pinos fixados por interferencia. Ou seja, nao ha uma maneira
simples de reconfigurar este elemento, e caso houvesse, arrisca-se perder a robustez no seu
funcionamento.
Esta deixa de ser uma opcao, e nesse sentido apenas uma completa reformulacao
do derailleur – talvez abandonando completamente o acionamento por cabo e a mola de
retorno, acoplando um servo motor na sua construcao4 – deve funcionar.
A terceira opcao e, entre todas, aquela que mais se aproxima da substituicao de um
agente humano no controle, ou seja, um atuador capaz de produzir o torque necessario
para a troca de marchas. O que significa ir ao mercado e pesquisar as opcoes disponıveis
de servos de alto torque.
4.2.1 Resolucao de problemas
Para prosseguir com os trabalhos, a tentativa foi pegar um velho derailleur e afrouxar a
sua mola de retorno. Porem o acesso a mola nao e direto, e a mola foi completamente
4A fabricante japonesa Shimano possui uma serie de derailleurs eletronicos de controle manual chamada
Di2
– 24 –
Page 26
4.2 Teste de Bancada
Figura 21: Detalhe da construcao da gaiola do derailleur.
retirada. Ainda assim, alguma forca de retorno e necessaria, entao um elastico foi adaptado
ao mecanismo, como apresentado na figura 22.
Figura 22: Tentativa de adaptacao de derailleur.
No canto esquerdo da imagem observa-se o que restou da tentativa de afrouxamento
da mola de retorno.
O sistema foi novamente testado, configurado para inicialmente estar na sexta e
ultima marcha, isto e, na marcha mais veloz e de menor torque. O comportamento espe-
rado e, dada uma velocidade mınima de cadencia para que o estado nao seja considerado
de coasting, e cadencia abaixo do ideal para a marcha, a troca para a marcha superior fosse
– 25 –
Page 27
4.2 Teste de Bancada
disparada. O que de fato foi observado numa va tentativa, ja que novamente o torque do
servo nao foi suficiente para a movimentacao.
O proseguimento dos testes foi feito desacoplando o cabo do atuador e realizando
as trocas manualmente – para obter as relacoes corretas entre as marchas. Destes testes
vieram correcoes e ajustes no software que e descrito na secao seguinte.
4.2.2 Detalhes da Implementacao
O primeiro detalhe em destaque e a aquisicao dos tempos de revolucao da roda e da
cadencia (rotacao do pedivela). Houve a necessidade de usar rotinas de interrupcao para
tratar os eventos gerados pelos reed’s e poder contar o tempo entre cada evento. As inter-
rupcoes, como dizem o nome, interrompem o fluxo de execucao do programa, chamando
a rotina de interrupcao para processar o evento de forna aninhada. O requisito de qual-
quer rotina de interrupcao e que seja breve para que o fluxo geral do sistema nao fique
prejudicado.
Dois pinos de entrada digital 2 e 3 do Arduino foram associados as rotinas para
contar o tempo da cadencia e da roda, respectivamente. A associacao e feita na borda
de descida do sinal, tornando o sistema mais robusto aos efeitos do bouncing nos reed
switches. O trecho de codigo a seguir, parte do arquivo principal.pde, e referente ao
tempo da cadencia apenas, pois nao ha necessidade de reproduzir o codigo do tempo da
roda, visto que apenas alguns nomes sao substituıdos.
1 // Pin c o n f i g f o r i n t e r r u p t r o u t i n e
2 a t tach In t e r rup t ( 0 , cadence monitor , FALLING ) ;
3 . . .
4 /∗
5 ∗ cadence t ime i n t e r r u p t
6 ∗ r o u t i n e
7 ∗/
8 void cadence monitor ( )
9 // f i r s t t ime l o g
10 i f ( c == fa l se )
11 ctimeLog [ 0 ] = m i l l i s ( ) ;
12 c=true ;
13
14 else
15 ctimeLog [ 1 ] = m i l l i s ( ) ;
16 ctime = ctimeLog [ 1 ] − ctimeLog [ 0 ] ;
17 ctimeLog [ 0 ] = ctimeLog [ 1 ] ;
18
19
20 . . .
21 /∗
22 ∗ t imer s r e s e t r o u t i n e
23 ∗/
24 void r e s e t t im e r s ( )
25 unsigned long now = m i l l i s ( ) ;
26 i f (now − wtimeLog [ 0 ] > RESET TIMEOUT)
27 wtime = 0 ;
28
29 i f (now − ctimeLog [ 0 ] > RESET TIMEOUT)
30 ctime = 0 ;
31
32
– 26 –
Page 28
4.2 Teste de Bancada
Na linha 2, a configuracao necessaria para associar a interrupcao a rotina cadencemonitor
na borda de descida. No linha 8, a rotina de interrupcao propriamente dita, guarda
na primeira execucao um valor de tempo (funcao millis() que retorna a contagem de
tempo em milissegundos desde que o microcontrolador foi iniciado) inicial. Da segunda
chamada em diante, a variavel ctime recebe o tempo da cadencia atraves da subtracao
do registro atual do tempo de execucao com o registro anterior anterior, armazenado no
vetor ctimeLog.
Na linha 24, a funcao reset timers e usada para zerar os contadores de tempo de
cadencia e roda para que, caso a interrupcao nao seja disparada por um tempo muito
grande, o valor destes contadores nao retornem valores absurdos.
O segundo detalhe fica em conta do fluxo de execucao do algoritmo apresentado na
secao 3.4. A implementacao principal foi feita em um looping infinito (funcao loop() na
primeira linha). No trecho do codigo do arquivo principal.pde:
1 void loop ( )
2 r a t i o=f loat ( ctime )/wtime ;
3 for ( int i =0; i <6; i++)
4 i f ( c l o s e t o ( ra t i o , v a l i d r a t i o s [ i ] ,TOLERANCE))
5 gear = i +1;
6
7
8 // check i f c o a s t i n g
9 i f ( ( ctime < CADENCE MIN ) && ( ctime != 0))
10 // i f not ac t over t r an sm i s s i on
11 trocador . s e t g e a r ( motor , gear , ctime , wtime , K ) ;
12
13 wspeed = roda . g e t l s p e ed ( wtime ) ;
14 update l cd ( ) ;
15 upda t e s e r i a l ( ) ;
16 i f ( d ig i ta lRead ( b1Pin ) == HIGH )
17 K=K+0.01;
18 i f ( K >= 1.5 )
19 K = 1 . 5 ;
20
21
22 . . .
23
24 /∗
25 ∗ Return t r u e i f param i s w i t h i n
26 ∗ t o l e r a n c e [%] o f r e f e r e n c e :
27 ∗/
28 boolean c l o s e t o ( f loat param , f loat r e f e r enc e , f loat t o l e r an c e )
29 return ( ( param >= ( r e f e r e n c e ∗(100− t o l e r an c e )/100) ) &&
30 (param <= ( r e f e r e n c e ∗(100+ to l e r an c e )/100) ) ) ;
31
A execucao na linha 2 e no laco for que segue calcula a relacao entre o tempo da cadencia
e tempo da roda, e atualiza o valor da marcha engatada, usando a funcao closeto, linha 28,
que retorna verdadeiro caso o valor da relacao esteja contido no vetor das relacoes esperadas
validratios, com uma margem de tolerancia. Este vetor e obtido com o script ratios.py
apresentado na secao 6.2.4 de Anexos, com base na relacao de dentes de engrenagem da
transmissao usada.A rotina para determinacao da marcha engatada e originalmente parte
do codigo da biblioteca, porem algum problema nao diagnosticado impedia que a chamada
a esta funcao retornasse o valor correto.
– 27 –
Page 29
4.2 Teste de Bancada
O teste da linha 9, testa se o ciclista esta ”deslizando”(coasting), ou seja, em mo-
vimento inercial sem movimentar os pedais. Caso nao esteja, a execucao segue apenas
verificando os botoes de configuracao, lendo informacao de velocidade, e atualizando o
display. Caso o ciclista esteja pedalando faz chamada a funcao da biblioteca que se encar-
rega de testar e trocar a marcha, quando necessario.
A configuracao da constante K de ajuste dos limites de troca de marcha, feita atraves
dos botoes esta, para apenas um botao, na linha 16 a 21. Limitou-se a configuracao em
mais ou menos 50% do valor padrao.
O terceiro e mais importante detalhe da implementacao e metodo de escolha e mu-
danca de marcha, da classe Derailleur. Este metodo recebe o objeto representando o servo
motor, a marcha atual, os tempos de roda e cadencia (i.e. as velocidades) e a constante
K de ajuste. O trecho a seguir mostra a implementacao.
1 /∗
2 ∗ Core method o f t h e l i b r a r y . r e s p on s a b l e
3 ∗ f o r choos ing and s e t t i n g a new gear
4 ∗ p o s i t i o n
5 ∗/
6 void De r a i l l e u r : : s e t g e a r ( Servo motor , int gear , long int c t , long int w t ,
7 f loat K )
8 int c u r p o s i t i o n = motor . read ( ) ;
9 int t a r g e t p o s i t on = round (STEP∗ gear ) ;
10 // make sure t h a t d e r a i l l e u r i s a t e x p e c t e d p o s i t i o n
11 i f ( c u r p o s i t i o n != t a r g e t p o s i t on )
12 motor . wr i t e ( t a r g e t p o s i t on ) ;
13
14 else
15 i f ( ( c t > CADENCE MIN∗K ) && ( gear != GEAR MIN ) )
16 // Hold p o s i t i o n a l i t t l e l ower f o r a l i t t l e t ime
17 motor . wr i t e ( round ( STEP∗ ( gear − 1 ) ∗UP OFFSET ) ) ;
18 S e r i a l . p r i n t l n ( ”Mais torque ! ” ) ;
19 de lay ( 7 00 ) ;
20 // and then l e a v e in b e s t p o s i t i o n
21 motor . wr i t e ( STEP∗ ( gear − 1 ) ) ;
22 else i f ( ( c t < CADENCEMAX∗K ) && ( gear != GEARMAX ) )
23 // Hold p o s i t i o n a l i t t l e h i g h e r f o r a l i t t l e t ime
24 motor . wr i t e ( round ( STEP∗ ( gear + 1 ) ∗DOWNOFFSET ) ) ;
25 S e r i a l . p r i n t l n ( ”Mais ve l oc idade . . . ” ) ;
26 de lay ( 7 00 ) ;
27 // and then l e a v e in b e s t p o s i t i o n
28 motor . wr i t e ( STEP∗ ( gear + 1 ) ) ;
29
30
31
O metodo inicia, na linha 11, confirmando se a marcha atualmente engatada, vinda da
relacao de velocidades, e a mesma da posicao do servo motor. Caso esteja, prossegue para,
na linha 15 testar a condicao ”Velocidade abaixo do limite inferior para a relacao”levando
em consideracao o fator K de ajuste, e a condicao ”Coroa anterior disponıvel”, como
apresentado no fluxograma da figura 15. Da mesma forma, o codigo da linha 22 testa a
condicao ”Velocidade alem do limite superior para a relacao”levando em conta o fator K
de ajuste, e a condicao ”Proxima coroa disponıvel”, tambem apresentado no fluxograma
do algoritmo.
Nas linhas 16 a 21 e 23 a 28, executa o comando para mudanca de marcha pro-
– 28 –
Page 30
4.2 Teste de Bancada
priamente dito, para subida e descida respectivamente. A primeira acao e movimentar o
derailleur um pouco alem da posicao de engate, em seguida segurar esta posicao por um
curto tempo, para em seguida retornar a posicao da nova marcha engatada. Este e um
pequeno truque usado em trocadores manuais mais sofisticados para agilizar o engate.
4.2.3 Resultados
Apesar de nao ter sido possıvel testar o sistema em sua plenitude, a observacao da movi-
mentacao do servo motor, livre do cabeamento, e a visualizacao de dados do programa na
interface serial sugerem que, dada uma solucao para as questoes mecanicas do atuador, a
proposta do projeto pode ser alcancada.
Das premissas estabelecidas para o projeto (secao 2.3), apenas a segunda delas
nao pode ser considerada satisfeita (Adaptabilidade ao sistema existente), visto que uma
solucao para a questao do atuador nao esta definida.
– 29 –
Page 31
5 Conclusoes
5 Conclusoes
Em tempos de aumento da preocupacao com questoes ambientais, emissao de poluentes,
humanizacao das cidades, – descaracterizadas e transformadas para servir aos veıculos
automotores – a bicicleta aparece como um agente transformador. Seu apelo ecologico e a
saude, baixo custo e facilidade de uso ja a promovem ao veıculo urbano do futuro, sendo
que as diversas iniciativas de incentivo ao uso de bicicletas comunitarias e/ou publicas ao
redor do mundo, e inclusive em nossa Universidade, estao aı para embasar esta tese. Neste
contexto, um projeto que visa evoluir e facilitar o uso da bicicleta merece um pouco de
atencao.
Muitas extensoes podem ser feitas neste projeto, que e uma implementacao simpli-
ficada do conceito. A primeira adicao proposta e um segundo atuador para ser capaz de
manipular o derailleur das coroas dianteiras, podendo utilizar toda a extensao das mar-
chas disponıveis. Uma forma de incluir esse atuador no algoritmo seria realizar as trocas
nas coroas dianteiras quando a mudanca de velocidade for mais brusca. Isso porque a
relacao entre as coroas dianteiras e tipicamente maior quando comparadas a relacao entre
as coroas do cassete.
Uma segunda sugestao e um sistema de gerenciamento de energia, com baterias e
dınamos de roda, que seriam capazes de manter o sistema rodando apenas com a propria
geracao de energia.
A terceira sugestao e a possibilidade de configuracao de parametros em runtime,
alem de apenas a constante de ajuste K.
Como quarta, a adicao de modulos de memoria persistente para que configuracoes
nao sejam perdidas a cada desligamento do sistema.
Finalmente, a quinta e ultima sugestao e a integracao de um acelerometro eletronico,
de onde e possıvel ler a informacao de inclinacao do terreno. Como em um automovel,
por vezes e interessante adiar a troca de marcha em subidas (a ”esticada”) e postergar na
descida.
Por fim e ao cabo, apesar da conclusao sem sucesso, a oportunidade de aplicar a
parte mais interessante de todo o conhecimento acumulado na graduacao e bater de frente
em dificuldades da engenharia real foi bastante satisfatoria. Ressalto que este relatorio
encerra o trabalho de graduacao, porem nao encerra o projeto do cambio automatico para
bicicletas.
– 30 –
Page 32
6 Anexos
6 Anexos
6.1 Custos do Projeto
Os custos dos materiais utilizados foram relativamente baixos. O reaproveitamento de
componentes previamente adquiridos, e principalmente, o baixo custo dos componentes
envolvidos possibilitaram minimizar esta soma. A Tabela 1 a seguir computa os compo-
nentes e ferramentas.
Tabela 1: Custos do projeto
Material Preco (R$)
Movimento central R$ 12,00
Display LCD 16x2 R$ 20,00
Arduino Duemilenove R$ 40,00
Servo Futaba s3004 R$ 12,00
Ferro de solda 100W R$ 18,00
Reed switch (5x) R$ 3,45
Resistores 10k (6x) R$ 0,78
Total R$ 106,23
6.2 Codigo Fonte
6.2.1 API da Biblioteca BikeTransmission
BikeTransmission.h:
1 /∗
2 ∗ BikeTransmiss ion . h − B i c y c l e Model ing C l a s s e s f o r Arduino
3 ∗ Vers ion 0 .1
4 ∗
5 ∗ This i s f i l e i s pa r t o f a my f i n a l g r adua t i on work .
6 ∗ This code i s i n t ended to be used w i th an arduino to
7 ∗ a u t oma t i c a l l y c o n t r o l gear changes o f a commom
8 ∗ b y c i c l e d e r a i l l e u r .
9 ∗
10 ∗ Author : Paulo S . Machado
11 ∗ Date : October 2011
12 ∗
13 ∗ Re l ease under de GNU Pub l i c L i cense v3 . 0 or g r e a t e r
14 ∗ This l i b r a r y i s f r e e s o f twa r e ; you can r e d i s t r i b u t e i t and/ or
15 ∗ modify i t under t h e terms o f t h e GNU General Pub l i c
16 ∗ License as p u b l i s h e d by t h e Free So f tware Foundation ; e i t h e r
17 ∗ v e r s i o n 3 .0 o f t h e License , or ( a t your op t i on ) any l a t e r v e r s i o n .
18 ∗
19 ∗ This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
20 ∗ bu t WITHOUT ANY WARRANTY; w i t hou t even the imp l i e d warranty o f
21 ∗ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See t h e GNU
22 ∗ General Pub l i c L i cense f o r more d e t a i l s .
23 ∗
24 ∗ You shou l d have r e c e i v e d a copy o f t h e GNU General Pub l i c
25 ∗ License a l ong w i th t h i s l i b r a r y ; i f not , w r i t e to t h e Free So f tware
26 ∗ Foundation , Inc . , 51 Frank l i n St , F i f t h Floor , Boston , MA 02110−1301 USA
– 31 –
Page 33
6.2 Codigo Fonte
27 ∗/
28
29 #include <Servo . h>
30
31 #ifndef BikeTransmiss ion h
32 #define BikeTransmiss ion h
33 #endif
34
35 /∗ RearWheel − r ear whee l model
36 ∗ a t t r i b u t e s :
37 ∗ d iameter − whee l d iameter in meters
38 ∗ methods :
39 ∗ r e ad wspe ed s en so r − update p e r i od o f whee l c y c l e
40 ∗ g e t l s p e e d − c a l c u l a t e and r e t u rn l i n e a r speed
41 ∗/
42 class RearWheel
43 public :
44 f loat diameter ;
45 RearWheel ( f loat diameter ) ;
46 // uns igned l ong r ead wspe ed s en so r ( i n t w reedPin ) ;
47 int g e t l s p e ed ( long unsigned int T ) ;
48 ;
49
50 /∗ De r a i l l e u r − d e r a i l l e u r model
51 ∗ a t t r i b u t e s :
52 ∗
53 ∗ methods :
54 ∗ g e t g e a r − c a l c u l a t e t h e engaged gear from c y c l e t ime r a t i o
55 ∗ s e t g e a r − de c i d e and move d e r a i l l e u r to a p p r o p r i a t e gear
56 ∗/
57 class De r a i l l e u r
58 public :
59 int ge t g ea r ( unsigned long c t , unsigned long w t ) ;
60 void s e t g e a r ( Servo motor , int gear , long int c t , long int w t , f loat K ) ;
61 ;
6.2.2 Implementacao da Biblioteca BikeTransmission
BikeTransmission.cpp:
1 /∗
2 ∗ BikeTransmiss ion . cpp − B i c y c l e Model ing C l a s s e s f o r Arduino
3 ∗ Vers ion 0 .1
4 ∗
5 ∗ This i s f i l e i s pa r t o f a my f i n a l g r adua t i on work .
6 ∗ This code i s i n t ended to be used w i th an arduino to
7 ∗ a u t oma t i c a l l y c o n t r o l gear changes o f a commom
8 ∗ b i c y c l e D e r a i l l e u r .
9 ∗
10 ∗ Author : Paulo S . Machado
11 ∗ Date : October 2011
12 ∗
13 ∗ Re l ease under de GNU Pub l i c L i cense v3 . 0 or g r e a t e r
14 ∗ This l i b r a r y i s f r e e s o f twa r e ; you can r e d i s t r i b u t e i t and/ or
15 ∗ modify i t under t h e terms o f t h e GNU General Pub l i c
16 ∗ License as p u b l i s h e d by t h e Free So f tware Foundation ; e i t h e r
17 ∗ v e r s i o n 3 .0 o f t h e License , or ( a t your op t i on ) any l a t e r v e r s i o n .
18 ∗
19 ∗ This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
20 ∗ bu t WITHOUT ANY WARRANTY; w i t hou t even the imp l i e d warranty o f
21 ∗ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See t h e GNU
22 ∗ General Pub l i c L i cense f o r more d e t a i l s .
23 ∗
24 ∗ You shou l d have r e c e i v e d a copy o f t h e GNU Lesse r Genera l Pub l i c
25 ∗ License a l ong w i th t h i s l i b r a r y ; i f not , w r i t e to t h e Free So f tware
26 ∗ Foundation , Inc . , 51 Frank l i n St , F i f t h Floor , Boston , MA 02110−1301 USA
27 ∗/
28
29
30
31 #include ”BikeTransmiss ion . h”
– 32 –
Page 34
6.2 Codigo Fonte
32 #include <Servo . h>
33 #include <WProgram . h>
34 #include <math . h>
35
36 const int GEARMAX=6;
37 const int GEAR MIN=1;
38 const int TOTAL PATH=180;
39 const int TOTAL GEARS=6;
40 const int STEP=TOTAL PATH/TOTAL GEARS;
41 const int TOLERANCE=0.05;
42 const f loat v a l i d r a t i o s [TOTAL GEARS]=1.0769 , 1 .2174 , 1 . 4 , 1 .6471 , 1 .8667 , 2 . 1538 ;
43
44 // Time l i m i t s ( m i l l i s e c o n d s )
45
46 const int CADENCE MIN=1600;
47 // 90RPM − 667ms
48 const int CADENCEMAX=667;
49
50 // O f f s e t in t h e d e r a i l l e u r moviment to engage nex t gear
51 const f loat UP OFFSET=0.9;
52 const f loat DOWNOFFSET=1.1;
53
54 /∗∗∗∗∗∗∗∗∗ Cons t ruc t o r s imp l ementa t ion ∗∗∗∗∗∗∗∗∗∗∗∗/
55 RearWheel : : RearWheel ( f loat diameter )
56 this−>diameter = diameter ;
57
58
59
60 /∗∗∗∗∗∗∗∗∗∗∗ Methods imp lementa t ion ∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
61
62
63 /∗
64 ∗ Linear whee l speed :
65 ∗ V = w∗r −> V = 2∗ p i∗ f ∗r
66 ∗ V = pi∗D/T [m/ms ]
67 ∗ V = (3.6∗1000∗ p i∗D)/T [ km/h ]
68 ∗/
69 int RearWheel : : g e t l s p e ed ( unsigned long T )
70 int l speed ;
71 // c ond i t i o n to speed l e s s than 1km/h
72 i f ( ( T > 7350 ) | | ( T == 0 ) ) return 0 ;
73 l speed = round ( (1000∗3 .6∗3 .1416∗ ( this−>diameter ) )/T ) ;
74 return ( l speed ) ;
75
76
77 /∗
78 ∗ Return t r u e i f param i s w i t h i n
79 ∗ t o l e r a n c e [%] o f r e f e r e n c e :
80 ∗/
81 boolean c l o s e t o 2 ( f loat param , f loat r e f e r enc e , f loat t o l e r an c e )
82 return ( ( param >= ( r e f e r e n c e ∗(1.00− t o l e r an c e ) ) ) &&
83 ( param <= ( r e f e r e n c e ∗(1.00+ to l e r an c e ) ) ) ) ;
84
85
86 /∗
87 ∗ Return the cu r r en t gear based on known
88 ∗ gear r a t i o s and r e v o l t i o n t imes
89 ∗ TODO: Discover why t h i s dont work
90 ∗ i n s i d e t h e l i b r a r y
91 ∗/
92 int De r a i l l e u r : : g e t g ea r ( unsigned long c t , unsigned long w t )
93 f loat r a t i o ;
94 r a t i o=f loat ( c t )/ w t ;
95 for ( int i =0; i<TOTAL GEARS; i++)
96 i f ( c l o s e t o 2 ( ra t i o , v a l i d r a t i o s [ i ] ,TOLERANCE))
97 return ( i +1);
98
99
100
101
102 /∗
103 ∗ Core method o f t h e l i b r a r y . r e s p on s a b l e
104 ∗ f o r choos ing and s e t t i n g a new gear
– 33 –
Page 35
6.2 Codigo Fonte
105 ∗ p o s i t i o n
106 ∗/
107 void De r a i l l e u r : : s e t g e a r ( Servo motor , int gear , long int c t , long int w t , f loat K )
108 int c u r p o s i t i o n = motor . read ( ) ;
109 int t a r g e t p o s i t on = round (STEP∗ gear ) ;
110 // make sure t h a t d e r a i l l e u r i s a t e x p e c t e d p o s i t i o n
111 i f ( c u r p o s i t i o n != t a r g e t p o s i t on )
112 motor . wr i t e ( t a r g e t p o s i t on ) ;
113
114 else
115 i f ( ( c t > CADENCE MIN∗K ) && ( gear != GEAR MIN ) )
116 // Hold p o s i t i o n a l i t t l e l ower f o r a l i t t l e t ime
117 motor . wr i t e ( round ( STEP∗ ( gear − 1 ) ∗UP OFFSET ) ) ;
118 S e r i a l . p r i n t l n ( ”Mais torque ! ” ) ;
119 delay ( 7 00 ) ;
120 // and then l e a v e in b e s t p o s i t i o n
121 motor . wr i t e ( STEP∗ ( gear − 1 ) ) ;
122 else i f ( ( c t < CADENCEMAX∗K ) && ( gear != GEARMAX ) )
123 // Hold p o s i t i o n a l i t t l e h i g h e r f o r a l i t t l e t ime
124 motor . wr i t e ( round ( STEP∗ ( gear + 1 ) ∗DOWNOFFSET ) ) ;
125 S e r i a l . p r i n t l n ( ”Mais ve l oc idade . . . ” ) ;
126 delay ( 7 00 ) ;
127 // and then l e a v e in b e s t p o s i t i o n
128 motor . wr i t e ( STEP∗ ( gear + 1 ) ) ;
129
130
131
6.2.3 Programa principal
principal.pde
1 /∗
2 ∗ Main . pde − Main f i l e t o c o n t r o l a b i c y c l e d e r a i l l e u r
3 ∗ Vers ion 0 .1
4 ∗
5 ∗ This i s f i l e i s pa r t o f a my f i n a l g r adua t i on work .
6 ∗ This code i s i n t ended to be used w i th an arduino to
7 ∗ a u t oma t i c a l l y c o n t r o l gear changes o f a commom
8 ∗ b i c y c l e d e r a i l l e u r .
9 ∗
10 ∗ Var i a b l e s p r e f i x e d w i th ”w” are r e f e r e n c e d to whee l
11 ∗ Var i a b l e s p r e f i x e d w i th ”c” are r e f e r e n c e d to t h e cadence
12 ∗
13 ∗ Author : Paulo S . Machado
14 ∗ Date : October 2011
15 ∗
16 ∗ Re l ease under de GNU Pub l i c L i cense v3 . 0 or g r e a t e r
17 ∗ This l i b r a r y i s f r e e s o f twa r e ; you can r e d i s t r i b u t e i t and/ or
18 ∗ modify i t under t h e terms o f t h e GNU General Pub l i c
19 ∗ License as p u b l i s h e d by t h e Free So f tware Foundation ; e i t h e r
20 ∗ v e r s i o n 3 .0 o f t h e License , or ( a t your op t i on ) any l a t e r v e r s i o n .
21 ∗
22 ∗ This l i b r a r y i s d i s t r i b u t e d in t h e hope t h a t i t w i l l be u s e f u l ,
23 ∗ bu t WITHOUT ANY WARRANTY; w i t hou t even the imp l i e d warranty o f
24 ∗ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See t h e GNU
25 ∗ General Pub l i c L i cense f o r more d e t a i l s .
26 ∗
27 ∗ You shou l d have r e c e i v e d a copy o f t h e GNU Lesse r Genera l Pub l i c
28 ∗ License a l ong w i th t h i s l i b r a r y ; i f not , w r i t e to t h e Free So f tware
29 ∗ Foundation , Inc . , 51 Frank l i n St , F i f t h Floor , Boston , MA 02110−1301 USA
30 ∗/
31
32 #include <Liqu idCrysta l . h>
33 #include <BikeTransmiss ion . h>
34 #include <Servo . h>
35
36
37
38 // Ob j e c t s i n s t a t i a t i o n
39 Servo motor ;
– 34 –
Page 36
6.2 Codigo Fonte
40 De r a i l l e u r t rocador ;
41 L iqu idCrysta l l cd ( 7 , 6 , 5 , 4 , 8 , 10 ) ;
42 RearWheel roda ( 0 .65 ) ;
43
44 // Cons tants
45 const int b0Pin = 11 ; // K−
46 const int b1Pin = 12 ; // K+
47 const int r0Pin = 3 ; // Wheel
48 const int r1Pin = 2 ; // Cadence
49 const int pwmPin = 9 ; // PWM pin
50 const unsigned int CADENCE MIN = 3000; // MIN SPEED = MAX TIME coa s t i n g
51 const unsigned long RESET TIMEOUT = 3000; // Timeout f o r r e s e t t imer s
52 const int debugLevel = 2 ; // Se t debug v e r b o s i t y in s e r i a l
53
54 const int TOTAL GEARS=6;
55 const int TOLERANCE=5;
56 const f loat v a l i d r a t i o s [TOTAL GEARS]=1.0769 , 1 .2174 , 1 . 4 , 1 .6471 , 1 .8667 , 2 . 1538 ;
57
58 // Va r i a b l e s
59 unsigned int wspeed , s t a t e =1;
60 int gear=6;
61 f loat K=1.00;
62
63 f loat r a t i o ;
64
65 // I n t e r r u p t used v a r i a b l e s
66 volat i le boolean w=fa l se ;
67 volat i le boolean c=fa l se ;
68 volat i le unsigned long ctime=0;
69 volat i le unsigned long wtime=0;
70 volat i le unsigned long ctimeLog [ 2 ] ;
71 volat i le unsigned long wtimeLog [ 2 ] ;
72
73 /∗
74 ∗ General p in s and s t a r t u p r ou t i n e
75 ∗/
76 void setup ( )
77 S e r i a l . begin ( 9600 ) ;
78 l cd . begin ( 16 ,2 ) ;
79 l cd . p r i n t ( ” s t a r t up . . . ” ) ;
80 delay ( 2000 ) ;
81 l cd . c l e a r ( ) ;
82 l cd . p r i n t ( ”Vel : ” ) ;
83 l cd . setCursor ( 8 ,0 ) ;
84 l cd . p r i n t ( ”kmph” ) ;
85 l cd . setCursor ( 0 ,1 ) ;
86 l cd . p r i n t ( ”Marcha : ” ) ;
87 l cd . setCursor ( 10 ,1 ) ;
88 l cd . p r i n t ( ”K: ” ) ;
89 motor . attach ( pwmPin ) ;
90 pinMode ( b0Pin , INPUT ) ;
91 pinMode ( b1Pin , INPUT ) ;
92 pinMode ( r0Pin , INPUT ) ;
93 pinMode ( r1Pin , INPUT ) ;
94 a t tach In t e r rup t ( 1 , wheel monitor , FALLING ) ;
95 a t tach In t e r rup t ( 0 , cadence monitor , FALLING ) ;
96
97
98 /∗
99 ∗ Disp l ay r e f r e s h r ou t i n e
100 ∗/
101 void update l cd ( )
102 l cd . setCursor ( 4 ,0 ) ;
103 l cd . p r i n t ( ” ” ) ;
104 l cd . setCursor ( 4 ,0 ) ;
105 l cd . p r i n t ( wspeed ) ;
106 l cd . setCursor ( 7 ,1 ) ;
107 l cd . p r i n t ( gear ) ;
108 l cd . setCursor ( 12 ,1 ) ;
109 l cd . p r i n t ( K ) ;
110
111
112 /∗
– 35 –
Page 37
6.2 Codigo Fonte
113 ∗ S e r i a l debug ou tpu t r o u t i n e
114 ∗/
115 void upda t e s e r i a l ( )
116 i f ( debugLevel == 2)
117 S e r i a l . p r i n t ( ”Veloc idade : ” ) ; S e r i a l . p r i n t ( wspeed ) ; S e r i a l . p r i n t l n ( ” kmph” ) ;
118 S e r i a l . p r i n t ( ”Marcha : ” ) ; S e r i a l . p r i n t l n ( gear ) ;
119 S e r i a l . p r i n t ( ”Tempo roda : ” ) ; S e r i a l . p r i n t ( wtime ) ; S e r i a l . p r i n t l n ( ” ms” ) ;
120 S e r i a l . p r i n t ( ”Tempo cadenc ia : ” ) ; S e r i a l . p r i n t ( ctime ) ; S e r i a l . p r i n t l n ( ” ms” ) ;
121 S e r i a l . p r i n t ( ”K: ” ) ; S e r i a l . p r i n t l n (K) ; S e r i a l . p r i n t l n ( ”” ) ;
122
123
124
125 /∗
126 ∗ Main l oop
127 ∗/
128 void loop ( )
129 r a t i o=f loat ( ctime )/wtime ;
130 for ( int i =0; i <6; i++)
131 i f ( c l o s e t o ( ra t i o , v a l i d r a t i o s [ i ] ,TOLERANCE))
132 gear = i +1;
133
134
135
136 // check i f c o a s t i n g
137 i f ( ( ctime < CADENCE MIN ) && ( ctime != 0))
138 // i f not ac t over t r an sm i s s i on
139 trocador . s e t g e a r ( motor , gear , ctime , wtime , K ) ;
140
141 /∗
142 ∗ Refre sh d i s p l a y s
143 ∗/
144 wspeed = roda . g e t l s p e ed ( wtime ) ;
145 update l cd ( ) ;
146 upda t e s e r i a l ( ) ;
147 /∗
148 ∗ Button 1 read , k++
149 ∗/
150 i f ( d ig i ta lRead ( b1Pin ) == HIGH )
151 K=K+0.01;
152 i f ( K >= 1.5 )
153 K = 1 . 5 ;
154
155
156 /∗
157 ∗ Button 0 read , k−−
158 ∗/
159 i f ( d ig i ta lRead ( b0Pin ) == HIGH )
160 K=K−0.01;
161 i f ( K <= 0.5 )
162 K = 0 . 5 ;
163
164
165 delay ( 600 ) ;
166 r e s e t t im e r s ( ) ;
167
168
169 /∗
170 ∗ whee l t ime i n t e r r u p t
171 ∗ r o u t i n e
172 ∗/
173 void wheel monitor ( )
174 // f i r s t t ime l o g
175 i f ( w == fa l se )
176 wtimeLog [ 0 ] = m i l l i s ( ) ;
177 w=true ;
178
179 else
180 wtimeLog [ 1 ] = m i l l i s ( ) ;
181 wtime = wtimeLog [ 1 ] − wtimeLog [ 0 ] ;
182 wtimeLog [ 0 ] = wtimeLog [ 1 ] ;
183
184
185
– 36 –
Page 38
6.2 Codigo Fonte
186 /∗
187 ∗ cadence t ime i n t e r r u p t
188 ∗ r o u t i n e
189 ∗/
190 void cadence monitor ( )
191 // f i r s t t ime l o g
192 i f ( c == fa l se )
193 ctimeLog [ 0 ] = m i l l i s ( ) ;
194 c=true ;
195
196 else
197 ctimeLog [ 1 ] = m i l l i s ( ) ;
198 ctime = ctimeLog [ 1 ] − ctimeLog [ 0 ] ;
199 ctimeLog [ 0 ] = ctimeLog [ 1 ] ;
200
201
202
203 /∗
204 ∗ t imer s r e s e t r o u t i n e
205 ∗/
206 void r e s e t t im e r s ( )
207 unsigned long now = m i l l i s ( ) ;
208 i f (now − wtimeLog [ 0 ] > RESET TIMEOUT)
209 wtime = 0 ;
210
211 i f (now − ctimeLog [ 0 ] > RESET TIMEOUT)
212 ctime = 0 ;
213
214
215
216 /∗
217 ∗ Return t r u e i f param i s w i t h i n
218 ∗ t o l e r a n c e [%] o f r e f e r e n c e :
219 ∗/
220 boolean c l o s e t o ( f loat param , f loat r e f e r enc e , f loat t o l e r an c e )
221 return ( ( param >= ( r e f e r e n c e ∗(100− t o l e r an c e )/100) ) &&
222 (param <= ( r e f e r e n c e ∗(100+ to l e r an c e )/100) ) ) ;
223
6.2.4 Calculo de Relacao entre marchas
ratios.py
1 #! / u s r / b i n / env py t h on 2
2 # −∗− c o d i n g : u t f −8 −∗−
3
4 # r a t i o s . py − I n t e r a c t i v e s c r i p t t o c a l c u l a t e g e a r t im e / t e e t h r a t i o s
5 # V e r s i o n 0 . 1
6 #
7 # Th i s i s f i l e i s p a r t o f a my f i n a l g r a d u a t i o n work .
8 # Th i s c o d e i s i n t e n d e d t o be u s e d w i t h an a r d u i n o t o
9 # a u t o m a t i c a l l y c o n t r o l g e a r c h a n g e s o f a commom
10 # b y c i c l e d e r a i l l e u r .
11 #
12 # Autho r : Pau l o S . Machado
13 # Date : A p r i l 2 0 1 0
14 #
15 # R e l e a s e u nd e r de GNU P u b l i c L i c e n s e v3 . 0 o r g r e a t e r
16 # Th i s l i b r a r y i s f r e e s o f t w a r e ; you can r e d i s t r i b u t e i t and / o r
17 # mod i f y i t u nd e r t h e t e rm s o f t h e GNU G e n e r a l P u b l i c
18 # L i c e n s e a s p u b l i s h e d by t h e F r e e S o f t w a r e F o u n d a t i o n ; e i t h e r
19 # v e r s i o n 3 . 0 o f t h e L i c e n s e , o r ( a t y o u r o p t i o n ) any l a t e r v e r s i o n .
20 #
21 # Th i s l i b r a r y i s d i s t r i b u t e d i n t h e hope t h a t i t w i l l be u s e f u l ,
22 # but WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
23 # MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
24 # Ge n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
25 #
26 # You s h o u l d hav e r e c e i v e d a c opy o f t h e GNU G e n e r a l P u b l i c
27 # L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e F r e e S o f t w a r e
28 # Founda t i o n , I n c . , 51 F r a n k l i n St , F i f t h F l o o r , Bo s ton , MA 02110 −1301 USA
– 37 –
Page 39
6.2 Codigo Fonte
29
30 import os
31 os . system ( ” c l e a r ” )
32
33 print ”Ca lcu la te Gear Rat ios with S p e c i f i c i e d Tolerance : \n”
34 gear s = in t ( raw input ( ”Number o f gear s : ” ) )
35 t o l = f l o a t ( raw input ( ”Percentage o f t o l e r an c e : ” ) )
36 crown = in t ( raw input ( ”Number o f t ee th in f r on t gear : ” ) )
37 min = f l o a t ( crown∗ (1− t o l /100 ) )
38 max = f l o a t ( crown∗ ( 1+t o l /100 ) )
39 l=[ ]
40 l 1=[ ]
41 l 2=[ ]
42
43 for i in range ( gear s ) :
44 j = in t ( raw input ( ”Number o f t ee th in sprocket %d : ” % in t ( i+1 ) ) )
45 l . append ( j )
46
47 for i in l :
48 l 1 . append (min/ i )
49 l 2 . append (max/ i )
50
51 i f t o l != 0 :
52 print ”\nRatios range : ”
53 for i in range ( 0 , gear s ) :
54 print ”%s s t sprocket : ” % in t ( i+1 )
55 print ” ( r a t i o > %s ) && ( r a t i o < %s )\n” % ( l 1 [ i ] , l 2 [ i ] )
56 else :
57 print ”\nRatios vec tor : ”
58 for i in l 1 :
59 print round ( i , 4 )
60
61 print ”\nDON 'T FORGET TO APPLY CHANGES TO C++ CODE! ”
6.2.5 Calculo de Filtro RC
capacitance n resistance.py
1 #! / u s r / b i n / env py t h on 2 . 7
2 # −∗− c o d i n g : u t f −8 −∗−
3
4 # r a t i o s . py − I n t e r a c t i v e s c r i p t t o c a l c u l a t e g e a r t im e / t e e t h r a t i o s
5 # V e r s i o n 0 . 1
6 #
7 # Th i s i s f i l e i s p a r t o f a my f i n a l g r a d u a t i o n work .
8 # Th i s c o d e i s i n t e n d e d t o be u s e d w i t h an a r d u i n o t o
9 # a u t o m a t i c a l l y c o n t r o l g e a r c h a n g e s o f a commom
10 # b y c i c l e d e r a i l l e u r .
11 #
12 # Autho r : Pau l o S . Machado
13 # Date : A p r i l 2 0 1 0
14 #
15 # R e l e a s e u nd e r de GNU P u b l i c L i c e n s e v3 . 0 o r g r e a t e r
16 # Th i s l i b r a r y i s f r e e s o f t w a r e ; you can r e d i s t r i b u t e i t and / o r
17 # mod i f y i t u nd e r t h e t e rm s o f t h e GNU G e n e r a l P u b l i c
18 # L i c e n s e a s p u b l i s h e d by t h e F r e e S o f t w a r e F o u n d a t i o n ; e i t h e r
19 # v e r s i o n 3 . 0 o f t h e L i c e n s e , o r ( a t y o u r o p t i o n ) any l a t e r v e r s i o n .
20 #
21 # Th i s l i b r a r y i s d i s t r i b u t e d i n t h e hope t h a t i t w i l l be u s e f u l ,
22 # but WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
23 # MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . S e e t h e GNU
24 # Ge n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
25 #
26 # You s h o u l d hav e r e c e i v e d a c opy o f t h e GNU G e n e r a l P u b l i c
27 # L i c e n s e a l o n g w i t h t h i s l i b r a r y ; i f not , w r i t e t o t h e F r e e S o f t w a r e
28 # Founda t i o n , I n c . , 51 F r a n k l i n St , F i f t h F l o o r , Bo s ton , MA 02110 −1301 USA
29
30 from decimal import ∗
31 import os
32 os . system ( ” c l e a r ” )
33
– 38 –
Page 40
6.2 Codigo Fonte
34 print ”Capacitor and/ or Re s i s t o r value to reach cu t o f f f requency ”
35 print ” in a s imple RC low pass f i l t e r . Choose : ”
36
37 print ”1 − Capacitor ( r e s i s t e n c e input value ) ”
38 print ”2 − Res i s t o r ( capac i tance input value ) ”
39
40 i = in t ( raw input ( ”Choose [ 1/2 ] : ” ) )
41
42 i f i in [ 1 ,2 ] :
43 i f i == 1 :
44 f c = f l o a t ( raw input ( ”Cutof f f requency [Hz ] : ” ) )
45 r = f l o a t ( raw input ( ”Res i s tance [ ohm] : ” ) )
46
47 print ”You need a” , Decimal ( s t r ( 1/ ( 2∗3.1416∗ f c ∗ r ) ) ) . t o e n g s t r i n g ( ) , \
48 ”F capac i t o r ”
49 else :
50 f c = f l o a t ( raw input ( ”Cutof f f requency [Hz ] : ” ) )
51 c = f l o a t ( raw input ( ”Capacitance [F ] : ” ) )
52 print ”You need a” , Decimal ( s t r ( 1/ ( 2∗3.1416∗ f c ∗c ) ) ) . t o e n g s t r i n g ( ) , \
53 ”ohm r e s i s t o r ”
54 else :
55 print ” Inva l i d opt ion ” , i , ” . Ex i t ing . . . \ n”
– 39 –
Page 41
7 Referencias
7 Referencias
[1] Luis Antonio Aguirre. Enciclopedia de Automatica - Vol. 1. Blucher, 2007. 3
[2] Atmel Corporation. ATMega48/88/168 Summary. http://www.atmel.com/. 14
[3] Desconhecido. JHD162a Datasheet. Technical report, http://www.egochina.net.
cn/eBay/Download/JHD162A.pdf. 11
[4] Diversos. Arduino Homepage. http://www.arduino.cc. 15
[5] Diversos. Arduino Libraries. http://arduino.cc/en/Reference/Libraries. 15
[6] Diversos. AVR Libc. http://www.nongnu.org/avr-libc/user-manual/index.
html. 15
[7] Diversos. GCC, the Gnu Compiler Collection. http://gcc.gnu.org. 15
[8] MEDER Eletronic. The Basic Reed Switch. http://www.biltek.tubitak.gov.tr/
gelisim/elektronik/dosyalar/31/reed.pdf. 13
[9] Free Software Foundation. GNU General Public License. http://www.gnu.org/
licenses/gpl.html. 18
[10] European Patent Organisation. European Patent Office. http://www.epo.org. 6
[11] J. Oxer and H. Blemings. Practical Arduino: Cool Projects for Open Source Hardware.
Technology in Action. Apress, 2009. 15
[12] John Palmisano. Society of Robots. http://www.societyofrobots.com. 11
[13] Python Community. Python Programming Language. http://www.python.org. 13
[14] USPTO. United States Patent and Trademark Office. http://www.uspto.gov. 6
– 40 –