Top Banner
Universidade Estadual de Campinas Faculdade de Engenharia Mec ˆ anica ES952 - Trabalho de Graduac ¸ ˜ ao II Relat ´ orio de Atividades Desenvolvimento de um cˆ ambio autom´ atico para bicicletas Autor: Paulo Silveira Machado RA: 024831 Orientador: Prof. Dr. Luiz Ot´avio Saraiva Ferreira Faculdade de Engenharia Mecˆ anica 2º Semestre/2011
41

Desenvolvimento de um câmbio a automático para bicicletas

Jan 07, 2017

Download

Documents

duongnhu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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: Desenvolvimento de um câmbio a automático para bicicletas

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 –