Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas Embarcados Luis Claudio Gambôa Lopes Agenda • Primeira aula - 24/02/2018- 3 horas • Segunda aula - 03/03/2018- 3 horas • Terceira aula - 10/03/2018- 3 horas • Quarta aula - 17/03/2018- 3 horas • Quinta aula - 24/03/2018- 3 horas • Sexta aula - 07/04/2018- 3 horas • Sétima aula - 14/04/2018- 3 horas • Oitava aula - 28/04/2018- 3 horas • Nona aula - 28/04/2018- 3 horas 24/02/2018 Pós-graduação em Internet das Coisas 2 Conteúdo 1 Primeira Aula - 24/02/2018 I Introdução ao KICAD I Utilização do KICAD I Esquemático e PCB I Captura de Esquemático I Associação de Footprints I Criação da PCB 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 24/02/2018 Pós-graduação em Internet das Coisas 3 PRIMEIRA AULA Captura de esquemático e criação de PCB com o KICAD 24/02/2018 Pós-graduação em Internet das Coisas 4 Introdução ao KICAD • O KICAD é um conjunto de programas de código livre multiplataforma (windows/ linux/mac) para captura de esquemáticos, desenho de placas de circuito impresso (PCB) e vizualição 3D da placa. • O site oficial do projeto é o http://kicad-pcb.org/. • O programa pode ser baixado no endereço http://kicad-pcb.org/download/. • O KICAD recebe apoio para seu desenvolvimento de empresas e instituições como o CERN, Arduino e raspberry pi foundation http://kicad-pcb.org/about/kicad/ . • Neste turorial será descrita a instalação e algumas características do KiCad 4.0.2 para windows. 24/02/2018 Pós-graduação em Internet das Coisas 5 Instalação Ao executar o instalador será aberta a janela de boas vindas, basta clicar em next para continuar. 24/02/2018 Pós-graduação em Internet das Coisas 6 Instalação Na janela seguinte é possível escolher quais componentes devem ser instalados, por padrão todos já vem selecionados, basta clicar next para continuar. 24/02/2018 Pós-graduação em Internet das Coisas 7 Instalação Na próxima janela, é possível escolher onde o KICAD será instalado, para usar o diretório padrão basta clicar em next novamente. 24/02/2018 Pós-graduação em Internet das Coisas 8 Instalação Em sequência será mostrada a janela de progresso da instalação, basta esperar a instalação ser finalizada. 24/02/2018 Pós-graduação em Internet das Coisas 9 Instalação Na finalização, basta clicar em Finish para concluir. Se o checkbox for marcado, você será redirecionado para a página do Wings3D, um editor de modelos 3D usado para desenhar novos componentes 3D para o Kicad, para usar o Kicad o Wings3D não é necessário. 24/02/2018 Pós-graduação em Internet das Coisas 10 Utilização do KICAD Para iniciar o kicad basta clicar no ícone: A janela principal de projeto do KICAD será aberta. 24/02/2018 Pós-graduação em Internet das Coisas 11 Utilização do KICAD Nela são encontradas as principais ferramentas do KICAD (algumas só são habilitadas após um projeto ser aberto): Eeschema - Editor de esquemático Editor de biblioteca de símbolos de esquemático PcbNew - Editor de placas de circuito impresso editor de biblioteca de footprints GerbView - Visualizador de arquivos gerber Bitmap2Component - Conversor de figuras para componentes de esquemático ou footprint Pcb Calculator - Várias ferramentas para projeto de placas Pi editor - Editor de layout de páginas 24/02/2018 Pós-graduação em Internet das Coisas 12 Utilização do KICAD A primeira coisa a ser feita é criar ou abrir um projeto. Para ilustrar o funcionamento será aberto um projeto de exemplo que já vem junto ao KICAD. 24/02/2018 Pós-graduação em Internet das Coisas 13 Utilização do KICAD Apos clicar em Open Project na tela principal, abra o arquivo “C:/Program Files/KiCad/share/kicad/demos/pic_programmer/ pic_programmer.pro” (no Linux: “/usr/share/kicad/demos/pic_programmer/ pic_programmer.pro”) 24/02/2018 Pós-graduação em Internet das Coisas 14 Utilização do KICAD Agora na tela de projeto do KICAD é possível ver os arquivos do projeto de exemplo. 24/02/2018 Pós-graduação em Internet das Coisas 15 Utilização do KICAD Clicando no arquivo com extensão .sch, será aberto a janela do Eeschema, o editor de esquemáticos do KICAD. No caso do projeto de exemplo, é mostrado o equemático do circuito eletrônico de um gravador de microcontroladores PIC. 24/02/2018 Pós-graduação em Internet das Coisas 16 Utilização do KICAD Clicando no arquivo com extensão .kicad_pcb, será aberto a janela do PcbNew, o editor de placas de circuito impresso do KICAD. 24/02/2018 Pós-graduação em Internet das Coisas 17 Utilização do KICAD Dentro do PcbNew, é possível abrir o visualizador 3D, acessando a opção “3D Viewer” no menu “Ver”. 24/02/2018 Pós-graduação em Internet das Coisas 18 Utilização do KICAD Na janela de visualização 3D é possível visualizar e rotacionar a placa de circuito impresso, vendo todos os detalhes da posição dos componentes na placa. 24/02/2018 Pós-graduação em Internet das Coisas 19 Utilização do KICAD O KICAD ainda possui algumas ferramentas (Pcb calculator) como o visualizador de código de cores de resistores de acordo com a precisão. 24/02/2018 Pós-graduação em Internet das Coisas 20 Utilização do KICAD E uma calculadora de largura da trilha de cobre de acordo com a corrente e comprimento da trilha. 24/02/2018 Pós-graduação em Internet das Coisas 21 Esquemático e PCB O processo de projeto de uma placa de circuito impresso (PCI ou PCB, do inglês printed circuit board), normalmente se resume a duas etapas no caso de placas simples: • Captura do esquemático; • Desenho da PCB. Para o caso de placas mais complexas outras etapas podem ser adicionadas, como por exemplo a análise de interferência eletromagnética entre as trilhas. 24/02/2018 Pós-graduação em Internet das Coisas 22 Esquemático e PCB O esquemático representa através de símbolos os elementos e ligações de um circuito eletrônico. Por exemplo, um capacitor pode ser representado pelos símbolos abaixo no Kicad: 24/02/2018 Pós-graduação em Internet das Coisas 23 Esquemático e PCB Todos sabemos que na realidade um capacitor não se parece com seu símbolo gráfico, como podemos comprovar com a visualização dos modelos de capacitores 3D do Kicad abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 24 Esquemático e PCB Logo, somente o símbolo do capacitor e seu valor não são suficientes para desenhar, é preciso saber qual o formato do capacitor e suas dimensões físicas para poder desenhá-lo na placa. Essas informações recebem o nome de footprint (cuja tradução significa “pegada”) que é o desenho de acordo com o formato e tamanho do elemento. Para capacitores podemos utilizar por exemplo alguns dos footprints abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 25 Esquemático e PCB Agora com o entendimento que um esquemático utiliza símbolos para representar os elementos de um circuito e o desenho da PCB utiliza footprints para representar os elementos fica mais claro a diferença entre as duas etapas de projeto de uma PCB. 24/02/2018 Pós-graduação em Internet das Coisas 26 Captura de Esquemático Para facilitar o entendimento, vamos utilizar como exemplo um circuito para acionamento de relé de 5 volts (vendido normalmente como shield relé). Este circuito permite microcontroladores e plataformas microcontroladas (Arduino e outros) acionar uma carga de maior potência (lâmpadas ou motores por exemplo) através de um relé. Como o relé normalmente precisa de uma corrente maior do que a fornecida pelos pinos de um microcontrolador, é utilizado um transistor para resolver este problema.Além do transistor é necessário um diodo de proteção junto a bobina do relé e é usado um LED para indicar se o relé está ligado ou não. 24/02/2018 Pós-graduação em Internet das Coisas 27 Captura de Esquemático Para confecção desse circuito são necessários os seguintes componentes: • 1 resistor 1k 1/8W • 1 resistor 10k 1/8W • 1 diodo 1N4148 • 1 LED 3mm • 1 transistor BC548 • 1 conector header 3 • 2 conector kre 3 • 1 relé de 5V e 2 contatos Com essas informações podemos começar a captura do esquemático. 24/02/2018 Pós-graduação em Internet das Coisas 28 Captura de Esquemático Primeiramente, na janela inicial do Kicad devemos criar um novo projeto, acessando o menu “Arquivo->New Project->New Project”, conforme figura abaixo. 24/02/2018 Pós-graduação em Internet das Coisas 29 Captura de Esquemático Na janela aberta, escolha o diretório onde os arquivos do projeto serão salvos e dê um nome ao projeto, para este exemplo foi usado o nome “acionamento”. 24/02/2018 Pós-graduação em Internet das Coisas 30 Captura de Esquemático Em sequência, devemos abrir o editor de esquemático Eeschema, clicando no ícone 24/02/2018 Pós-graduação em Internet das Coisas 31 Captura de Esquemático Na janela principal do Eeschema podemos utilizar a roda do mouse (mouse wheel) para dar zoom no esquemático, o zoom é centralizado pelo cursor. A adição de componentes pode ser feita utilizando o ícone “place componentes” acessado na barra de ferramentas da direita ou pelo menu Inserir. 24/02/2018 Pós-graduação em Internet das Coisas 32 Captura de Esquemático Após clicar no botão de adicionar componentes deve-se clicar em qualquer ponto onde se deseja inserir o componente no esquemático. Depois do clique é aberta um janela para a seleção dos componentes. A busca pode ser feita digitando o nome do componente ou buscando o mesmo nas bibliotecas listadas. Digitando “r” selecionamos o resistor, clicando no botão ok o elemento é adicionado no esquemático. 24/02/2018 Pós-graduação em Internet das Coisas 33 Captura de Esquemático Podemos adicionar os outros elementos (menos o relé ,por enquanto) conforme quantidade e nome listados abaixo: Descrição Nome na biblioteca do Kicad Quantidade Resistor R 2 Diodo D 1 LED LED 1 Transistor BC548 1 Connector 3 vias CONN_01x03 3 24/02/2018 Pós-graduação em Internet das Coisas 34 Captura de Esquemático Depois de adicionados todos os componentes (exceto o relé), o esquemático deve ficar conforme a figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 35 Captura de Esquemático Para o relé, vamos criar um símbolo novo, já que o relé existente no Kicad não possui a pinagem compatível com o que iremos utilizar. Para criar um símbolo devemos clicar no ícone “library editor” ou utilizar o menu Tools. A janela de edição de símbolo é similar a janela principal. 24/02/2018 Pós-graduação em Internet das Coisas 36 Captura de Esquemático Podemos criar um componente do zero clicando no ícone “Create a new component” No nosso exemplo vamos criar um símbolo modificando um já existente, para isso primeiramente deve ser selecionada a biblioteca onde está o símbolo. Isto é feito clicando-se no ícone “select working library” Escolha a biblioteca “device” e clique em ok para continuar. 24/02/2018 Pós-graduação em Internet das Coisas 37 Captura de Esquemático Clicando no ícone “Load componente from library” escolha o componente Relay 2RT. Iremos modificar a pinagem deste componente padrão para criar um com a pinagem correta para nossa aplicação. 24/02/2018 Pós-graduação em Internet das Coisas 38 Captura de Esquemático Depois do componente carregado, dê um duplo clique sobre o nome “RELAY_2RT” para trocar o nome do componente para “RELE_NOVO”. 24/02/2018 Pós-graduação em Internet das Coisas 39 Captura de Esquemático Para movimentar vários elementos ao mesmo tempo, clique com o botão direito e arraste para marcar um retângulo de seleção, solte o botão e arrastar os componentes para posição desejada e clique para reposicioná-los. 24/02/2018 Pós-graduação em Internet das Coisas 40 Captura de Esquemático Reposicione os elementos conforme a figura abaixo para compor nosso novo componente. 24/02/2018 Pós-graduação em Internet das Coisas 41 Captura de Esquemático Usando um duplo clique sobre o círculo do pino abra as propriedades para trocar o número dos pinos: 24/02/2018 Pós-graduação em Internet das Coisas 42 Captura de Esquemático Troque a numeração dos pinos para ficar como a figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 43 Captura de Esquemático Com o cursor sobre o pino 3, pressione a teclar “r” 2 vezes para rotacioná-lo. 24/02/2018 Pós-graduação em Internet das Coisas 44 Captura de Esquemático Com o cursor sobre o pino 3, pressione a tecla “m” para movê-lo conforme abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 45 Captura de Esquemático Faça a mesma coisa com pino 6 para finalizar nosso novo componente. 24/02/2018 Pós-graduação em Internet das Coisas 46 Captura de Esquemático Agora devemos salvar o componente em uma nova biblioteca clicando no ícone “save current component to new library” Na caixa de diálogo aberta, salve a biblioteca no mesmo diretório do projeto. Caso desejar, troque o nome da biblioteca, que no exemplo tem o mesmo nome do componente “rele_novo.lib”. 24/02/2018 Pós-graduação em Internet das Coisas 47 Captura de Esquemático Ao salvar aparecerá a mensagem informando da necessidade de incluir a biblioteca no Eeschema para poder utilizá-la , aperte ok e feche o editor de componentes. 24/02/2018 Pós-graduação em Internet das Coisas 48 Captura de Esquemático De volta ao Eeschema, devemos entrar na opção do menu “Preferences -> Componente Libraries” para incluir a nova biblioteca criada com o novo relé (Esse é o mesmo procedimento para utilizar qualquer biblioteca de símbolos de terceiros no Kicad). 24/02/2018 Pós-graduação em Internet das Coisas 49 Captura de Esquemático No gerenciador de bibliotecas, clique no botão “Adicionar” para incluir a nova biblioteca: 24/02/2018 Pós-graduação em Internet das Coisas 50 Captura de Esquemático Na janela de seleção de arquivos, procure o diretório de projeto e abra o arquivo da biblioteca criada: Depois de incluída a biblioteca, pressione ok para fechar a janela de bibliotecas. 24/02/2018 Pós-graduação em Internet das Coisas 51 Captura de Esquemático Na janela principal do Eeschema, clique no ícone de adicionar componentes , e escolha o elemento criado “RELE_NOVO”. 24/02/2018 Pós-graduação em Internet das Coisas 52 Captura de Esquemático Com todos o elementos, agora é necessário rearranjá-los para as ligações entre eles serem feitas. Colocando o cursor sobre um elemento, e apertando a tecla “m” ele pode ser movido. A tecla “r” pode ser utilizada para rotacionar e a tecla “x” para espelhar o elemento. Usando esses comandos é possível arranjar o circuito como na figura abaixo. 24/02/2018 Pós-graduação em Internet das Coisas 53 Captura de Esquemático As ligações podem ser feitas clicando-se no ícone “place wire” e clicando nos círculos nos terminais dos componentes. 24/02/2018 Pós-graduação em Internet das Coisas 54 Captura de Esquemático Conecte todos os elementos como a figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 55 Captura de Esquemático Intencionalmente foi deixada a conexão do resistor da base do transistor desconectada, para que haja um erro para demonstrarmos o uso da ferramenta de detecção de erro. Antes disso, os componentes precisam ser nomeados (inicialmente eles são denominados R?, D?, etc...), para isso clique no ícone“Annotate schematic components” . Na janela que foi aberta, use as opções padrão e clique no botão “Annotate”: 24/02/2018 Pós-graduação em Internet das Coisas 56 Captura de Esquemático Na janela aberta em seguida, clique em OK. 24/02/2018 Pós-graduação em Internet das Coisas 57 Captura de Esquemático Agora todos os componentes estão nomeados, como a figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 58 Captura de Esquemático Com os componentes nomeados, é possível usar a ferramenta de detecção de erro ERC, clicando no ícone “perform electrical rules check“ . Na janela aberta clique no botão RUN. Clique nos links de texto em azul para navegar para as partes do circuito que não estão conectadas ou apresentando problemas (no caso do exemplo, a base do transistor que ficou desconectada). 24/02/2018 Pós-graduação em Internet das Coisas 59 Captura de Esquemático Os erros podem ser corrigidos conectando-se os pinos indicados ou marcando o pino como não conectado clicando no ícone ”place not-connected flag“ . Os erros aparecem indicados com setas verdes como na figura abaixo. 24/02/2018 Pós-graduação em Internet das Coisas 60 Captura de Esquemático Completando a ligação da base do transistor, basta aperta RUN na tela da ferramenta de detecção de erro para verificar se está tudo ok, nenhuma mensagem aparece neste caso como na tela abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 61 Captura de Esquemático Fechando a ferramenta de detecção de erro, voltamos ao circuito que agora está com todas conexões corretas. Agora, para completar o esquemático basta colocar os valores dos componentes. Isso pode ser feito colocando-se o cursor sobre o elemento e apertando a tecla ”v“, como mostrado para o resistor R1 na figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 62 Captura de Esquemático Alguns componentes já tem valores como por exemplo o transistor, LED e o relé. Os demais elementos devem receber o valor conforme a tabela abaixo: Elemento Valor R1 1k R2 10k D2 1N4148 P1 Header 1x3 P2 KRE3 P3 KRE3 24/02/2018 Pós-graduação em Internet das Coisas 63 Captura de Esquemático O esquema completo pode ser visto na figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 64 Captura de Esquemático É possível adicionar anotações de texto usando a tecla ”t“ e por exemplo descrever as conexões do conector P1, como na figura abaixo: Com o esquemático pronto, podemos salvá-lo e seguir para o próximo passo. 24/02/2018 Pós-graduação em Internet das Coisas 65 Associação de Footprints O próximo passo é adicionar o footprint correspondente de cada componente para podermos desenhar a PCB, isso pode ser feito clicando no ícone ”Run CvPcb“ para abrir a ferramenta CvPcb. Ao abri-lo aparecerá a mensagem abaixo, clique Sim. 24/02/2018 Pós-graduação em Internet das Coisas 66 Associação de Footprints Isso ocorre porque o elemento Q1 (BC548) já tem um footprint associado que não foi encontrado, como pode ser constatado na nova mensagem: 24/02/2018 Pós-graduação em Internet das Coisas 67 Associação de Footprints A janela principal do CvPcvmostra uma lista com os elementos e o footprint associado a cada um. 24/02/2018 Pós-graduação em Internet das Coisas 68 Associação de Footprints Dando um duplo clique nos footprints,na caixa da direita eles podem ser adicionados ao componente. Como no caso do LED na figura abaixo, onde foi adicionado o footprint LED-3mm. 24/02/2018 Pós-graduação em Internet das Coisas 69 Associação de Footprints É possível visualizar o footprint antes de selecioná-lo utilizando o ícone ”view selected footprint“ , que abre a janela abaixo. 24/02/2018 Pós-graduação em Internet das Coisas 70 Associação de Footprints Utilizando o ícone ”3d Display“ na janela de visualização do footprint é possível ver o modelo tridimensional associado ao footprint: 24/02/2018 Pós-graduação em Internet das Coisas 71 Associação de Footprints Os footprints são determinados de acordo com os formatos e dimensões dos componentes físicos disponíveis para construção da placa. Logo é preciso saber estas informações antes de projetar a PCB. No caso do nosso exemplo, os footprints utilizados são para os componentes comuns, ao invés disso poderiam ser usados componentes SMD, por exemplo. 24/02/2018 Pós-graduação em Internet das Coisas 72 Associação de Footprints Nome Footprint D1 LEDs:LED-3MM D2 Diodes_ThroughHole:Diode_DO- 35_SOD27_Horizontal_RM10 K1 Relays_ThroughHole:Relay_DPDT_IM0 (3,6,7)NS P1 Pin_Headers:Pin_Header_Straight_1x03 P2 Connect:bornier3 P3 Connect:bornier3 Q1 TO_SOT_Packages_THT:TO- 92_Inline_Narrow_Oval R1 Resistors_ThroughHole: Resistor_Horizontal_RM10mm R2 Resistors_ThroughHole: Resistor_Horizontal_RM10mm 24/02/2018 Pós-graduação em Internet das Coisas 73 Associação de Footprints A lista completa é mostrada na janela abaixo, agora basta salvar, fechar o CvPcb e voltar ao Eeschema. 24/02/2018 Pós-graduação em Internet das Coisas 74 Associação de Footprints Na tela principal, agora é necessário criar o netlist para a criação do PCB. Isto pode ser feito pelo ícone ”Generate netlist“ ou pelo menu ”Tools->Generate Net List File“: 24/02/2018 Pós-graduação em Internet das Coisas 75 Associação de Footprints Na janela aberta, na aba Pcbnew, clique no botão ”Generate“: 24/02/2018 Pós-graduação em Internet das Coisas 76 Associação de Footprints Clique na opção salvar no diálogo de salvamento de arquivo, escolhendo o mesmo diretório do projeto. 24/02/2018 Pós-graduação em Internet das Coisas 77 Criação da PCB Agora podemos passar para o passo final, que é a criação da placa. No Eeschema utilizando o ícone ou menu ”Tools->Layout printed circuit board“ é possível acessar o Pcbnew. 24/02/2018 Pós-graduação em Internet das Coisas 78 Criação da PCB Na tela principal do PcbNew, utilizando o ícone ”Read netlist“ , podemos abrir a janela de carregamento do arquivo de netlist. 24/02/2018 Pós-graduação em Internet das Coisas 79 Criação da PCB O netlist pode ser lido utilizando o botão ”Ler Netlist atual“, depois disso a janela pode ser fechada. 24/02/2018 Pós-graduação em Internet das Coisas 80 Criação da PCB Agora na tela principal do Pcbnew estão todos os footprintsdos componentes, mas todos sobrepostos. Marcando o ícone ”Mode:footprint“ e em seguida clicando com o botão direito na tela pode-se separar os componentes utilizando a opção ”Global Spread and Place -> Spread out All Footprints“: 24/02/2018 Pós-graduação em Internet das Coisas 81 Criação da PCB Agora todos os footprints dos componentes estão separados como a figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 82 Criação da PCB Desenhando uma borda na placa para limitar o posicionamento pode ser utilizado o ”autoplace“ para posicionar automaticamente os componentes. Como o circuito é simples, a alocação dos componentes será feita manualmente, colocando o cursor sobre os footprints e usando as teclas ”m“ para mover e ”r“ para rotacionar. 24/02/2018 Pós-graduação em Internet das Coisas 83 Criação da PCB Reposicione os footprints até que todas as linhas brancas que indicam as conexões estejam desembaraçadas, como na figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 84 Criação da PCB Para alterar as propriedades do projeto, acesse o menu ”Regras de Design->Regras de Design“: 24/02/2018 Pós-graduação em Internet das Coisas 85 Criação da PCB Para facilitar a construção de placas manuais, utilize uma largura de trilha de no mínimo 1mm e clique no botão ok. 24/02/2018 Pós-graduação em Internet das Coisas 86 Criação da PCB As trilhaspodem ser desenhadas manualmente clicando no ícone ”Add tracks and vias“ e escolhendo a camada no combobox de camadas . Para o auto roteamento, devemos escolher a opção ”mode: tracks“, clicando no ícone 24/02/2018 Pós-graduação em Internet das Coisas 87 Criação da PCB Agora clicando com o botão direito é possível escolher a opção no menu ”Auto- rotear -> Selecionar Par de Camadas“: 24/02/2018 Pós-graduação em Internet das Coisas 88 Criação da PCB Na janela aberta, marque as duas camadas para o mesmo lado da placa para fazer uma placa de uma camada, como na figura abaixo. 24/02/2018 Pós-graduação em Internet das Coisas 89 Criação da PCB Aparecerá uma mensagem de aviso, mas não se preocupe, apesar de indicar um problema, o roteamento ira funcionar, só clicar ok. 24/02/2018 Pós-graduação em Internet das Coisas 90 Criação da PCB Agora utilizando a opção do menu ”Auto-rotear -> Automatically Route All Footprints“ é possível rotear a placa: 24/02/2018 Pós-graduação em Internet das Coisas 91 Criação da PCB Resultando na placa roteada: 24/02/2018 Pós-graduação em Internet das Coisas 92 Criação da PCB Clique no ícone ”DRC“ para utilizar a ferramenta de verificação de erro, e clique ”iniciar DRC“: 24/02/2018 Pós-graduação em Internet das Coisas 93 Criação da PCB Como nenhum erro foi encontrado, a placa só precisa da definição da borda para ficar pronta. Escolha a camada ”Edge.Cuts“ no combo boxde camadas e a ferramenta de desenhar linhas gráficas clicando no ícone “Add grapich line” e desenhe uma borda como é mostrado na figura abaixo: 24/02/2018 Pós-graduação em Internet das Coisas 94 Criação da PCB Utilize o menu “ver -> 3D Viewer” para abrir o visualizador da placa tridimensional: 24/02/2018 Pós-graduação em Internet das Coisas 95 Criação da PCB No visualizador 3D clique e arraste o mouse para girar a placa em visão tridimensional: 24/02/2018 Pós-graduação em Internet das Coisas 96 Criação da PCB 24/02/2018 Pós-graduação em Internet das Coisas 97 Criação da PCB Para a criação dos arquivos gerber para confecção da placa, basta clicar no ícone “plot” . Em seguida escolher o formato “Gerber”, marcar as camadas desejadas e clicar no botão plotar e em seguida no botão “GenerateDrillFile”. Os arquivos gerado podem ser testados na ferramenta gerberview do Kicad utilizando o ícone . 24/02/2018 Pós-graduação em Internet das Coisas 98 Criação da PCB Para utilização de métodos térmicos, o desenho da placa pode ser obtido da mesma maneira, apenas utilizando a opção “PDF” ao invés de “Gerber”. Desmarque a opção “Exclude PCB edge layer from others layer” para a margem aparecer em todos os pdfs e facilitar o posicionamento. 24/02/2018 Pós-graduação em Internet das Coisas 99 Criação da PCB Com isso concluímos o nosso tutorial, onde o objetivo foi mostrar como utilizar a ferramenta Kicad para criar uma PCB. Claro que o Kicad possui muito mais recursos e opções do que foi descrito, mas esse tutorial descreve o básico para poder começar a utilizar o Kicad. 24/02/2018 Pós-graduação em Internet das Coisas 100 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 I Plataforma LAUNCHXL-CC2650 I IDE Code Composer Studio - CCS I Compilando a Biblioteca CC26xxware I Compilando um Projeto Simples I Entendendo o Programa I Depuração do Projeto 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 03/03/2018 Pós-graduação em Internet das Coisas 101 SEGUNDA AULA LAUNCHXL-CC2650, Code Composer Studio, biblioteca CC26xxware, projeto simples e depuração. 03/03/2018 Pós-graduação em Internet das Coisas 102 Plataforma LAUNCHXL-CC2650 03/03/2018 Pós-graduação em Internet das Coisas 103 CC2650 • Descrição • Datasheet • User guides 03/03/2018 Pós-graduação em Internet das Coisas 104 Ambiente de desenvolvimento integrado - IDE (Versão modificada do Eclipse) Download do CCS 03/03/2018 Pós-graduação em Internet das Coisas 105 Instalação CCS Para o CC2650 é necessário apenas o suporte ao SimpleLink CC26xx. 03/03/2018 Pós-graduação em Internet das Coisas 106 Instalação CC26xxware biblioteca CC26xxware • Atualmente passou a ser distribuída como parte do TI-RTOS. • Documentação de referência para programação Por razões de compatibilidade, vamos usar a versão levemente modificada da biblioteca utilizada no sistema operacional Contiki. Instalação mkdir ~/workspace_v7 cd ~/workspace_v7 git clone https://github.com/contiki-os/cc26xxware.git 03/03/2018 Pós-graduação em Internet das Coisas 107 Escolhendo o Workspace Ao iniciar o CCS possibilita a escolha de um diretório de trabalho onde serão salvos os projetos. 03/03/2018 Pós-graduação em Internet das Coisas 108 Criando um Novo Projeto de Biblioteca 03/03/2018 Pós-graduação em Internet das Coisas 109 Configurações do Projeto • Target: SimpleLink Wireless MCU CC2650F128 • Project Name: driverlib • Compiler Version: GNU • Project template: Empty project 03/03/2018 Pós-graduação em Internet das Coisas 110 Configurações do Projeto • Output Type: Library 03/03/2018 Pós-graduação em Internet das Coisas 111 Adicionando os Arquivos da Biblioteca 03/03/2018 Pós-graduação em Internet das Coisas 112 Selecionando os Arquivos Pasta: $USER/workspace_v7/cc26xxware/driverlib 03/03/2018 Pós-graduação em Internet das Coisas 113 Importação dos Arquivos 03/03/2018 Pós-graduação em Internet das Coisas 114 Desativando a Auto-inclusão de Cabeçalhos 03/03/2018 Pós-graduação em Internet das Coisas 115 Modificando as Propriedades do Projeto 03/03/2018 Pós-graduação em Internet das Coisas 116 Adicionando o Caminho dos Arquivos de Cabeçalho ${WORKSPACE_LOC}/cc26xxware/ 03/03/2018 Pós-graduação em Internet das Coisas 117 Compilando a Biblioteca CC26xxware 03/03/2018 Pós-graduação em Internet das Coisas 118 Compilando a Biblioteca CC26xxware Quando finalizada a compilação, a mensagem abaixo indica que a biblioteca foi criada: Finished building target: "libdriverlib.a" **** Build Finished **** 03/03/2018 Pós-graduação em Internet das Coisas 119 Criando um Novo Projeto 03/03/2018 Pós-graduação em Internet das Coisas 120 Configuração do Projeto • Target: SimpleLink Wireless MCU CC2650F128 • Project Name: simples • Compiler Version: GNU • Output File: Executable 03/03/2018 Pós-graduação em Internet das Coisas 121 Configuração do Projeto • Project template: Empty project (with main.c) 03/03/2018 Pós-graduação em Internet das Coisas 122 Adicionando uma Pasta ao Projeto 03/03/2018 Pós-graduação em Internet das Coisas 123 Configurando o Nome da Pasta Nome da pasta: Source 03/03/2018 Pós-graduação em Internet das Coisas 124 Organizando os Arquivos na Pasta Os arquivos podem ser arrastados para as pastas para serem organizados. 03/03/2018 Pós-graduação em Internet das Coisas 125 Adicionando Arquivos 03/03/2018 Pós-graduação em Internet das Coisas 126 Selecionando o Arquivo de Configuração Adicionar o arquivo com as funções de inicialização da biblioteca: $USER/workspace_v7/cc26xxware/startup_files/startup_gcc.c 03/03/2018 Pós-graduação em Internet das Coisas 127 Criando um Novo Arquivo 03/03/2018 Pós-graduação em Internet das Coisas 128 Selecionando o Nome do Arquivo Nome do Arquivo: Board.h 03/03/2018 Pós-graduação em Internet das Coisas 129 Atualizando o Conteúdo dos Arquivos Copie o conteúdo para os arquivos: • Board.h - Definições de configuraçãoda placa • main.c - Exemplo simples para piscar os LEDs placa 03/03/2018 Pós-graduação em Internet das Coisas 130 Configurando as Propriedades 03/03/2018 Pós-graduação em Internet das Coisas 131 Adicionando o Projeto driverlib como Dependência 03/03/2018 Pós-graduação em Internet das Coisas 132 Adicionando o Caminho dos Arquivos de Cabeçalho ${WORKSPACE_LOC}/cc26xxware/ 03/03/2018 Pós-graduação em Internet das Coisas 133 Adicionando no Linker a Biblioteca e o Caminho libdriverlib.a ${workspace_loc:/driverlib/Debug} 03/03/2018 Pós-graduação em Internet das Coisas 134 Compilando um projeto simples 03/03/2018 Pós-graduação em Internet das Coisas 135 Entendendo o Programa #include <stdint.h> #include <stdbool.h> /* Example/Board Header files */ #include "Board.h" #include "driverlib/prcm.h" //peripheral power #include "driverlib/sys_ctrl.h" //cpu delay //***************************************************************************** // // Blink the on-board LEDs. // //***************************************************************************** int main(void) { /* Disable global interrupts */ IntMasterDisable(); // Turn on the PERIPH PD PRCMPowerDomainOn(PRCM_DOMAIN_PERIPH); while (PRCMPowerDomainStatus(PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON); // Enable GPIO peripheral PRCMPeripheralRunEnable(PRCM_PERIPH_GPIO); /* Apply settings and wait for them to take effect */ PRCMLoadSet(); while (!PRCMLoadGet()); 03/03/2018 Pós-graduação em Internet das Coisas 136 Entendendo o Programa // Enable the GPIO pin for the LEDs. Set the direction as output IOCPinTypeGpioOutput(BOARD_IOID_LED_1); IOCPinTypeGpioOutput(BOARD_IOID_LED_2); // Loop forever. while (1) { // Turn on the LED. GPIO_setDio(BOARD_IOID_LED_1); GPIO_clearDio(BOARD_IOID_LED_2); // // Delay for one second. // CPUdelay((SysCtrlClockGet() / 3)); // Turn off the LED. GPIO_clearDio(BOARD_IOID_LED_1); GPIO_setDio(BOARD_IOID_LED_2); // Delay for one second. CPUdelay((SysCtrlClockGet() / 3)); } } 03/03/2018 Pós-graduação em Internet das Coisas 137 Exercícios 2.1- Procure na Referência para programação a descrição das funções CPUdelay() e SysCtrlClockGet(). 03/03/2018 Pós-graduação em Internet das Coisas 138 Ativando o Modo de Depuração 03/03/2018 Pós-graduação em Internet das Coisas 139 Executando o Programa 03/03/2018 Pós-graduação em Internet das Coisas 140 Pausando o Programa 03/03/2018 Pós-graduação em Internet das Coisas 141 Executando o Programa Passo a Passo 03/03/2018 Pós-graduação em Internet das Coisas 142 Terminando a Depuração 03/03/2018 Pós-graduação em Internet das Coisas 143 Configurando as Propriedades 03/03/2018 Pós-graduação em Internet das Coisas 144 Alterando as opções de Otimização 03/03/2018 Pós-graduação em Internet das Coisas 145 Exercícios 2.2- Rode o programa passo a passo depois de desligar a Otimização. 2.3- Copie o projeto “simples” com o novo nome de “botoes” e crie um programa que acenda cada LED de acordo com o acionamento de cada botão. Utilize as funções: • IOCPinTypeGpioInput - Para configurar pino como entrada • IOCIOPortPullSet - Para ligar o Pull-Up dos pinos • GPIO_readDio - Para ler o valor dos pinos 03/03/2018 Pós-graduação em Internet das Coisas 146 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 I ADC I PWM I Serial I 1◦ Trabalho 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 10/03/2018 Pós-graduação em Internet das Coisas 147 TERCEIRA AULA Utilização dos periféricos do CC2650: ADC, PWM, Serial e Timers 10/03/2018 Pós-graduação em Internet das Coisas 148 ADC Cabeçalho: #include "driverlib/aux_adc.h" Configuração: //ADC INPUT IOCPinTypeGpioInput (IOID_23); //Analog channel 7 IOCIOPortPullSet (IOID_23, IOC_NO_IOPULL); AONWUCAuxWakeupEvent (AONWUC_AUX_WAKEUP); while (!(AONWUCPowerStatusGet () & AONWUC_AUX_POWER_ON)); AUXWUCClockEnable ( AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK); while (AUXWUCClockStatus ( AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK) != AUX_WUC_CLOCK_READY); AUXADCSelectInput (ADC_COMPB_IN_AUXIO7); AUXADCEnableSync (AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_1P37_MS, AUXADC_TRIGGER_MANUAL); 10/03/2018 Pós-graduação em Internet das Coisas 149 ADC Medição: int val, adj_val, adj_mv; AUXADCGenManualTrigger (); val = AUXADCReadFifo (); adj_val = AUXADCAdjustValueForGainAndOffset (val, AUXADCGetAdjustmentGain (AUXADC_REF_FIXED), AUXADCGetAdjustmentOffset (AUXADC_REF_FIXED)); adj_mv = AUXADCValueToMicrovolts (AUXADC_FIXED_REF_VOLTAGE_NORMAL, adj_val); 10/03/2018 Pós-graduação em Internet das Coisas 150 Exercícios 3.1- Copie o projeto “simples” com o novo nome de “adc” e crie um programa que faça uma medição analógica utilizando o conversor ADC. 3.2- Utilize um breakpoint para visualizar o resultado da conversão. 3.3- Adicione as variáveis na janela de expressões e modifique o comportamento do breakpoint para só atualizar (Update View) ao invés de parar o programa. 10/03/2018 Pós-graduação em Internet das Coisas 151 TIMER/PWM Cabeçalho: #include "driverlib/timer.h" //timers Configuração: #define freq 1000 unsigned int load; // Enable TIMER peripheral PRCMPeripheralRunEnable (PRCM_PERIPH_TIMER0); /* Apply settings and wait for them to take effect */ PRCMLoadSet (); while (!PRCMLoadGet ()); TimerConfigure (GPT0_BASE, TIMER_CFG_A_PWM | TIMER_CFG_SPLIT_PAIR); /* Drive the I/O ID with GPT0 / Timer A */ IOCPortConfigureSet (BOARD_IOID_LED_1, IOC_PORT_MCU_PORT_EVENT0, IOC_STD_OUTPUT); 10/03/2018 Pós-graduação em Internet das Coisas 152 TIMER/PWM Continuação da configuração: load = (SysCtrlClockGet () / freq); TimerLoadSet (GPT0_BASE, TIMER_A, load); TimerMatchSet (GPT0_BASE, TIMER_A, load / 2); /* Start */ TimerEnable (GPT0_BASE, TIMER_A); 10/03/2018 Pós-graduação em Internet das Coisas 153 TIMER/PWM Acionamento: unsigned int duty=30; // saída a 30% TimerMatchSet (GPT0_BASE, TIMER_A, load * duty / 100); 10/03/2018 Pós-graduação em Internet das Coisas 154 Exercícios 3.4- Copie o projeto “simples” com o novo nome de “pwm” e crie um programa que faça o brilho dos LEDs variarem de 0% a 100% e em seguida de 100% a 0% repetindo indefinidamente esse comportamento, sendo o LED vermelho acesso inversamente ao verde (use o parâmetro IOC_IOMODE_INV na função IOCPortConfigureSet ). Utilize um atraso para que a variação seja visível. 10/03/2018 Pós-graduação em Internet das Coisas 155 Serial Cabeçalho: #include "driverlib/uart.h" //uart Configuração: /* Power on the SERIAL PD */ PRCMPowerDomainOn (PRCM_DOMAIN_SERIAL); while (PRCMPowerDomainStatus (PRCM_DOMAIN_SERIAL) != PRCM_DOMAIN_POWER_ON); /* Enable UART clock in active mode */ PRCMPeripheralRunEnable (PRCM_PERIPH_UART0); PRCMLoadSet (); while (!PRCMLoadGet ()); // Make sure the peripheral is disabled UARTDisable (UART0_BASE); // Make sure the TX pin is output / high before assigning it to // UART control to avoid falling edge glitches IOCPinTypeGpioOutput (BOARD_IOID_UART_TX); GPIO_setDio (BOARD_IOID_UART_TX); 10/03/2018 Pós-graduação em Internet das Coisas 156 Serial Continuação da configuração: //Map UART signals to the correct GPIO pins and configure them as //hardware controlled. IOCPinTypeUart (UART0_BASE, BOARD_IOID_UART_RX, BOARD_IOID_UART_TX, BOARD_IOID_UART_CTS, BOARD_IOID_UART_RTS); /* Configure the UART for 115,200, 8-N-1 operation. */ UARTConfigSetExpClk (UART0_BASE, SysCtrlClockGet (), 115200, (UART_CONFIG_WLEN_8| UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); /* Enable FIFOs */ UARTFIFOEnable(UART0_BASE); /* Enable UART */ UARTEnable(UART0_BASE); 10/03/2018 Pós-graduação em Internet das Coisas 157 Serial Utilização: //enviar UARTCharPut (UART0_BASE, 'O'); UARTCharPut (UART0_BASE, 'k'); UARTCharPut (UART0_BASE, '\r'); UARTCharPut (UART0_BASE, '\n'); //receber if (UARTCharsAvail (UART0_BASE)) { UARTCharPut (UART0_BASE, 'R'); UARTCharPut (UART0_BASE, ':'); UARTCharPut (UART0_BASE, ' '); while (UARTCharsAvail (UART0_BASE)) { UARTCharPut (UART0_BASE, UARTCharGet (UART0_BASE)); } UARTCharPut (UART0_BASE, '\r'); UARTCharPut (UART0_BASE, '\n'); } 10/03/2018 Pós-graduação em Internet das Coisas 158 Exercícios 3.5- Crie uma função void UARTPuts(const char* str) que envie uma string pela porta serial. 3.6- Copie o projeto “simples” com o novo nome de “serial” e crie um programa que envie pela serial as palavras “ligado” e “desligado” (utilizando a função UARTPuts criada no exercício anterior) quando forem recebidas as letras “l” e “d” respectivamente. 10/03/2018 Pós-graduação em Internet das Coisas 159 1◦ Trabalho Implemente o suporte ao protocolo descrito no arquivo serial.c sem modifica-lo no CC2650. Implemente o códigos das seguintes funções: void Serial_print (const char *str) void Serial_println(const char *str) int Serial_available(void) void Serial_readStringUntil(char *str, char end, int max) int digitalRead(char pin) void digitalWrite(char pin, char value) void analogWrite(char pin,unsigned char value) int analogRead(char pin) void delay(int ms) Arquivo com as definições das funções: funcoes.c Os pinos que devem ser utilizados no trabalho são: • 7 - Saida Digital - LED verde • 13 - Entrada Digital - Chave esquerda • 6 - Saida Analógica - LED vermelho • 23 - Entrada Analógica - ADC 10/03/2018 Pós-graduação em Internet das Coisas 160 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 I Monitor de Bateria e Temperatura I Interrupção do Timer I Interrupção do System Tick I Interrupção dos Pinos I Interrupção da Serial 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 17/03/2018 Pós-graduação em Internet das Coisas 161 QUARTA AULA Monitor de Bateria e Temperatura. Utilização das interrupções dos periféricos do CC2650: Pinos, Serial e Timers. 17/03/2018 Pós-graduação em Internet das Coisas 162 Monitor de Bateria e Temperatura Cabeçalho: 1 #include "driverlib/aon_batmon.h" Configuração: 1 AONBatMonEnable(); 2 // Loop forever. 3 while (1) 4 { 5 if(AONBatMonNewBatteryMeasureReady()) 6 { 7 int32_t valb=AONBatMonBatteryVoltageGet(); 8 valb=(valb * 125) >> 5; 9 ... 10 } 11 if(AONBatMonNewTempMeasureReady()) 12 { 13 int32_t valt=AONBatMonTemperatureGetDegC(); 14 ... 15 } 16 } 17/03/2018 Pós-graduação em Internet das Coisas 163 Exercícios 4.1- Copie o projeto “serial” com o novo nome de “batmon_serial” e crie um programa que envie pela serial os valores da bateria e da temperatura toda vez que ocorrer uma mudança em um dos valores. 17/03/2018 Pós-graduação em Internet das Coisas 164 Interrupção do Timer Cabeçalho: 1 #include "driverlib/timer.h" //timers 2 void Timer0IntHandler(void); Configuração: 1 // Enable TIMER peripheral 2 PRCMPeripheralRunEnable(PRCM_PERIPH_TIMER0); 3 /* Apply settings and wait for them to take effect */ 4 PRCMLoadSet(); 5 while (!PRCMLoadGet()); 6 /* enable global interrupts */ 7 IntMasterEnable(); 8 /* Configure the TIMER_A as 32-bit periodi timer.*/ 9 TimerConfigure(GPT0_BASE, TIMER_CFG_PERIODIC); 10 TimerLoadSet(GPT0_BASE, TIMER_A, SysCtrlClockGet()); 17/03/2018 Pós-graduação em Internet das Coisas 165 Interrupção do Timer Continuação da configuração: 11 /*Setup the interrupts for the timer timeouts*/ 12 IntEnable(INT_GPT0A); 13 TimerIntEnable(GPT0_BASE, TIMER_TIMA_TIMEOUT); 14 TimerIntRegister(GPT0_BASE, TIMER_A,Timer0IntHandler ); 15 /* Enable the timers.*/ 16 TimerEnable(GPT0_BASE, TIMER_A); 17 // Loop forever. 18 while (1) 19 { 20 } 17/03/2018 Pós-graduação em Internet das Coisas 166 Interrupção do Timer Rotina de serviço de interrupção: 1 // The interrupt handler for the first timer interrupt. 2 void 3 Timer0IntHandler(void) 4 { 5 // Clear the timer interrupt. 6 TimerIntClear(GPT0_BASE, TIMER_TIMA_TIMEOUT); 7 } 17/03/2018 Pós-graduação em Internet das Coisas 167 Exercícios 4.2- Copie o projeto “simples” com o novo nome de “int_timer” e crie um programa que pisque o LED vermelho da placa a cada 0,5 segundos utilizando a interrupção do timer0. Mantenha o LED verde piscando a cada 1 segundo no loop principal. 4.3- Adicione ao exercício anterior a configuração e a interrupção do timer1 para piscar o LED verde a cada 2 segundos. Deixe o loop principal vazio. 17/03/2018 Pós-graduação em Internet das Coisas 168 Interrupção do System Tick Cabeçalho: 1 #include "driverlib/systick.h" 2 void SysTickIntHandler(void); 3 uint32_t milis=0; Configuração: 1 /* enable global interrupts */ 2 IntMasterEnable(); 3 SysTickIntRegister(SysTickIntHandler) ; 4 SysTickIntEnable(); 5 SysTickPeriodSet(SysCtrlClockGet()/1000); //1 msec 6 SysTickEnable(); 7 // Loop forever. 8 while (1){ 9 if(milis > 1000){ 10 milis=0; 11 GPIO_toggleDio (BOARD_IOID_LED_1); 12 } 13 } 17/03/2018 Pós-graduação em Internet das Coisas 169 Interrupção do System Tick Rotina de serviço de interrupção: 1 void SysTickIntHandler(void) 2 { 3 milis++; 4 } 17/03/2018 Pós-graduação em Internet das Coisas 170 Exercícios 4.4- Copie o projeto “simples” com o novo nome de “int_systick” e crie um programa que pisque o LED vermelho da placa a cada 2 segundos e o LED verde a cada 3 segundos utilizando a variável milis atualizada pela interrupção do System Tick. 17/03/2018 Pós-graduação em Internet das Coisas 171 Interrupção dos Pinos Cabeçalho: 1 void IOCIntHandler(void); Configuração: 1 IOCPinTypeGpioInput (BOARD_IOID_KEY_LEFT); 2 IOCIOPortPullSet (BOARD_IOID_KEY_LEFT, IOC_IOPULL_UP); 3 IOCPinTypeGpioInput (BOARD_IOID_KEY_RIGHT); 4 IOCIOPortPullSet (BOARD_IOID_KEY_RIGHT, IOC_IOPULL_UP); 5 /* enable global interrupts */ 6 IntMasterEnable(); 7 IOCIOIntSet(BOARD_IOID_KEY_LEFT,IOC_INT_ENABLE,IOC_FALLING_EDGE); 8 IOCIOIntSet(BOARD_IOID_KEY_RIGHT,IOC_INT_ENABLE,IOC_FALLING_EDGE); 9 IntEnable(INT_AON_GPIO_EDGE); 10 IOCIntEnable(BOARD_IOID_KEY_LEFT); 11 IOCIntEnable(BOARD_IOID_KEY_RIGHT); 12 IOCIntRegister (IOCIntHandler ); 13 // Loop forever. 14 while (1){ 15 } 17/03/2018 Pós-graduação em Internet das Coisas 172 Interrupção dos Pinos Rotina de serviço de interrupção: 1 void 2 IOCIntHandler(void) 3 { 4 if(IOCIntStatus(BOARD_IOID_KEY_LEFT)) 5 { 6 // Clear the timer interrupt. 7 IOCIntClear (BOARD_IOID_KEY_LEFT); 8 } 9 if(IOCIntStatus(BOARD_IOID_KEY_RIGHT)) 10 { 11 // Clear the timer interrupt. 12 IOCIntClear (BOARD_IOID_KEY_RIGHT); 13 } 14 } 17/03/2018 Pós-graduação em Internet das Coisas 173 Exercícios 4.5- Copie o projeto “simples” com o novo nome de “int_chaves” e crie um programa que troque o estado do LED vermelho quando a chave direita for pressionada e o do LED verde quando a chave esquerda for liberada utilizando interrupção. 17/03/2018 Pós-graduação em Internet das Coisas 174 Interrupção da Serial Cabeçalho: 1 #include "driverlib/uart.h" //uart 2 void UART0IntHandler(void); Configuração: 1 /* Disable global interrupts */ 2 IntMasterDisable (); 3 /* Power on the SERIAL PD */ 4 PRCMPowerDomainOn (PRCM_DOMAIN_SERIAL); 5 while (PRCMPowerDomainStatus (PRCM_DOMAIN_SERIAL) != 6 PRCM_DOMAIN_POWER_ON); 7 /* Enable UART clock in activemode */ 8 PRCMPeripheralRunEnable (PRCM_PERIPH_UART0); 9 PRCMLoadSet (); 10 while (!PRCMLoadGet ()); 11 /* Make sure the peripheral is disabled */ 12 UARTDisable (UART0_BASE); 17/03/2018 Pós-graduação em Internet das Coisas 175 Interrupção da Serial Continuação da configuração: 13 /* Make sure the TX pin is output high before assigning 14 it to UART control to avoid falling edge glitches*/ 15 IOCPinTypeGpioOutput (BOARD_IOID_UART_TX); 16 GPIO_setDio (BOARD_IOID_UART_TX); 17 /* Map UART signals to the correct GPIO pins and configure 18 them as hardware controlled. */ 19 IOCPinTypeUart (UART0_BASE, BOARD_IOID_UART_RX, BOARD_IOID_UART_TX, 20 BOARD_IOID_UART_CTS, BOARD_IOID_UART_RTS); 21 /* Configure the UART for 115,200, 8-N-1 operation. */ 22 UARTConfigSetExpClk (UART0_BASE, SysCtrlClockGet (), 115200, 23 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | 24 UART_CONFIG_PAR_NONE)); 25 /* Generate an RX interrupt at FIFO 1/8 full. 26 We don't really care about the TX interrupt*/ 27 UARTFIFOLevelSet (UART0_BASE, UART_FIFO_TX1_8, UART_FIFO_RX1_8); 28 /* Enable FIFOs */ 29 UARTFIFOEnable(UART0_BASE); 17/03/2018 Pós-graduação em Internet das Coisas 176 Interrupção da Serial Continuação da configuração: 30 /* enable global interrupts */ 31 IntMasterEnable(); 32 IntEnable(INT_UART0_COMB); 33 UARTIntEnable(UART0_BASE,UART_INT_RX | UART_INT_RT); 34 UARTIntRegister (UART0_BASE,UART0IntHandler ); 35 UARTEnable(UART0_BASE); 36 // Loop forever. 37 while (1) 38 { 39 } 17/03/2018 Pós-graduação em Internet das Coisas 177 Interrupção da Serial Rotina de serviço de interrupção: 1 void 2 UART0IntHandler(void) 3 { 4 while (UARTCharsAvail (UART0_BASE)) 5 { 6 //Lê buffer (reseta condição que gerou a interrupção) 7 UARTCharPut (UART0_BASE, UARTCharGet (UART0_BASE)); 8 } 9 // Clear the timer interrupt. 10 UARTIntClear(UART0_BASE,UART_INT_RX | UART_INT_RT); 11 } 17/03/2018 Pós-graduação em Internet das Coisas 178 Exercícios 4.6- Copie o projeto “simples” com o novo nome de “int_serial” e crie um programa que troque o estado do LED vermelho quando ocorrer uma interrupção por recepção da porta serial. 17/03/2018 Pós-graduação em Internet das Coisas 179 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 I Interrupção do ADC I Arquitetura de Software Embarcado I Round Robin I Round Robin com Interrupções I Round Robin com Interrupções e Fila de Funções I 2◦ Trabalho I Sistema Operacional de Tempo Real I Conclusão 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 24/03/2018 Pós-graduação em Internet das Coisas 180 QUINTA AULA Utilização das interrupções do ADC do CC2650. Arquitetura de Software Embarcado. 24/03/2018 Pós-graduação em Internet das Coisas 181 Interrupção do ADC Cabeçalho: 1 #include "driverlib/aux_adc.h" 2 #include "driverlib/interrupt.h" 3 #include "inc/hw_aux_evctl.h" 4 void ADCIntHandler(void); 5 int val, adc_fim=0; Configuração: 1 //ADC INPUT 2 IOCPinTypeGpioInput (IOID_23); //Analog channel 7 3 IOCIOPortPullSet (IOID_23, IOC_NO_IOPULL); 4 AONWUCAuxWakeupEvent (AONWUC_AUX_WAKEUP); 5 while (!(AONWUCPowerStatusGet () & AONWUC_AUX_POWER_ON)); 6 AUXWUCClockEnable ( 7 AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK); 8 while (AUXWUCClockStatus ( 9 AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK) 10 != AUX_WUC_CLOCK_READY); 11 AUXADCSelectInput (ADC_COMPB_IN_AUXIO7); 24/03/2018 Pós-graduação em Internet das Coisas 182 Interrupção do ADC Continuação da configuração: 12 AUXADCEnableSync (AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_1P37_MS, 13 AUXADC_TRIGGER_MANUAL); 14 /* enable global interrupts */ 15 IntMasterEnable(); 16 IntEnable(INT_AUX_ADC_IRQ); 17 IntRegister(INT_AUX_ADC_IRQ, ADCIntHandler ); 18 // Loop forever. 19 int adj_val, adj_mv; 20 AUXADCGenManualTrigger (); 21 while (1){ 22 if(adc_fim) 23 { 24 adc_fim=0; 25 adj_val = AUXADCAdjustValueForGainAndOffset ( 26 val,AUXADCGetAdjustmentGain (AUXADC_REF_FIXED), 27 AUXADCGetAdjustmentOffset (AUXADC_REF_FIXED)); 28 adj_mv = AUXADCValueToMicrovolts (AUXADC_FIXED_REF_VOLTAGE_NORMAL, 29 adj_val); 30 AUXADCGenManualTrigger (); 31 } 32 } 24/03/2018 Pós-graduação em Internet das Coisas 183 Interrupção do ADC Rotina de serviço de interrupção: 1 void 2 ADCIntHandler(void) 3 { 4 uint32_t intStatus; 5 /* Get the status of the ADC_IRQ line and ADC_DONE */ 6 intStatus = HWREG(AUX_EVCTL_BASE + AUX_EVCTL_O_EVTOMCUFLAGS) & 7 (AUX_EVCTL_EVTOMCUFLAGS_ADC_IRQ | AUX_EVCTL_EVTOMCUFLAGS_ADC_DONE); 8 if (intStatus & AUX_EVCTL_EVTOMCUFLAGS_ADC_DONE) 9 { 10 //Lê buffer (reseta condição que gerou a interrupção) 11 val = AUXADCReadFifo(); 12 } 13 /* Clear the ADC_IRQ flag if it triggered the ISR */ 14 HWREG(AUX_EVCTL_BASE + AUX_EVCTL_O_EVTOMCUFLAGSCLR) = intStatus; 15 adc_fim=1; 16 } 24/03/2018 Pós-graduação em Internet das Coisas 184 Exercícios 5.1- Copie o projeto “serial” com o novo nome de “int_adc” e crie um programa que utilize a interrupção do ADC para medir os valores de um canal, faça a média de 10 amostras e envie o resultado pela porta serial continuamente. 24/03/2018 Pós-graduação em Internet das Coisas 185 Arquitetura de Software Embarcado • Uma arquitetura de software fornece a estrutura geral de uma aplicação embarcada independente da computação real a ser realizada • A escolha da arquitetura afeta questões como: • tempo de desenvolvimento / probabilidade de defeitos de software • capacidade de resposta e latência • tamanho de código/complexidade • Regra geral: • Utilizar a arquitetura mais simples possível que forneça os requisitos da aplicação • Qualquer complexidade/generalidade desnecessária custa mais esforço de desenvolvimento e verificação. 24/03/2018 Pós-graduação em Internet das Coisas 186 Arquitetura de Software Embarcado • Quatro escolhas mais comuns: • Round Robin simples • Round Robin com interrupções • Round Robin com interrupções e fila de funções • Arquiteuras baseadas em sistemas operacionais de tempo-real • As arquiteturas estão ordenadas por ordem de crescente complexidade • A arquitetura Round Robin (RR) também é chamadas execução cíclica na literatura sobre tempo-real • A principal diferencial entre as abordagens baseadas em RR e RTOS é que no RR o agendamento e o controle de admissão é feito pelo desenvolvedor em vez de deixá-lo para o SO 24/03/2018 Pós-graduação em Internet das Coisas 187 Round Robin • É a arquitetura mais simples, um loop único verifica dispositivos em sequência predefinida e executa a operações de E/S imediatamente. 1 while(1) { 2 if (device_1_ready()){/*Executa E/S e computação do D1.*/} 3 if (device_2_ready()){/*Executa E/S e computação do D2.*/} 4 ... 5 if (device_N_ready()){/*Executa E/S e computação do DN.*/} 6 } • Funciona bem para o sistema com poucos dispositivos, restrições de tempo triviais e custos de processamento proporcionalmente pequeno • Tempo de resposta do dispositivo “i” é igual a WCET do corpo do loop. (WCET - Worst Case Execution Time) 24/03/2018 Pós-graduação em Internet das Coisas 188 Exercício 5.2- Copie o projeto “serial” com o novo nome de “round_robin” e crie um programa que utilize a arquitetura Round Robin para executar as tarefas: 1 verificar chaves -> enviar “acionado” pela serial quando ativadas 2 verificar serial -> ligar/desliga LED verde (comandos l e d) 3 quando disponível vbat e temp -> enviar seus valores pela serial 24/03/2018 Pós-graduação em Internet das Coisas 189 Round Robin • Round Robin periódico • Caso o sistema necessite executar operações em diferentes frequências • Adicione um código para aguardaruma quantidade variável de tempo 1 while(1) { 2 waitForNextPeriod(10); // idle for up to 10 ms 3 if (device_1_ready()) { /*Executa E/S e computação do D1.*/ } 4 ... • Exercício: • Pense em como implementar um loop que é executado a cada 10 ms e como medir o desvio 24/03/2018 Pós-graduação em Internet das Coisas 190 Exercício 5.3- Copie o projeto “round_robin” com o novo nome de “round_robin_p” e execute o laço principal a cada 0,5 segundos, mantendo as restrições das tarefas e utilizando a arquitetura Round Robin periódico. Adicione a tarefa: 4 a cada segundo -> enviar valor do ADC pela serial e trocar o estado LED vermelho 24/03/2018 Pós-graduação em Internet das Coisas 191 Round Robin • Limitações da arquitetura: • Se alguns dispositivos exigem pequenos tempos de resposta, enquanto outros têm WCET grande, não será possível garantir que todas as restrições de tempo sejam atendidas • A arquitetura é frágil, adicionar uma nova tarefa pode facilmente causar prazos perdidos • Questão: • A ordem dos dispositivos é significativa? • Mesma pergunta, mas com código para dispositivos com diferentes tempos de processamento e restrições de tempo? 24/03/2018 Pós-graduação em Internet das Coisas 192 Round Robin com Interrupções • Eventos de hardware que exigem pequenos tempos de resposta manipulados por ISRs • Normalmente, ISRs fazem pouco mais do que definir flags e copiar dados 1 bool f_device_1 = FALSE; 2 bool f_device_2 = FALSE; 3 ... 4 void interrupt handle_dev_1() { 5 // handle device 1 6 f_device_1 = TRUE; 7 } 8 ... 9 void main() { 10 while (1) { 11 if(f_device_1) { 12 f_device_1 = FALSE; 13 // do processing related to device 1...} 14 if (f_device_2) { 15 ...} 16 }} 24/03/2018 Pós-graduação em Internet das Coisas 193 Exercício 5.4- Copie o projeto “round_robin_p” com o novo nome de “round_robin_int” e utilize as interrupções da serial, ADC, timer e pinos para implementar a arquitetura Round Robin com interrupções. 1 Comente a função de sincronização do loop 2 Inclua os cabeçalhos. 3 Inclua as configurações. 4 Inclua as funções de tratamento das interrupções. 5 Edite as tarefas para funcionar com as interrupções. 24/03/2018 Pós-graduação em Internet das Coisas 194 Round Robin com Interrupções • A latência de um ISR é função do tempo de resposta de ISR de maior prioridade • O limite inferior da latência do loop RR é o tempo de resposta das ISRs Todo código Todas tarfefas ISR Disp. 1 RR RR+I Maior Prioridade Menor Prioridade ISR Disp. 2 ISR Disp. 3 24/03/2018 Pós-graduação em Internet das Coisas 195 Round Robin com Interrupções • Desvantagens • Todo o código de tarefa é executado na mesma prioridade • Pode-se testar alguns flags várias vezes dentro do corpo do loop para reduzir a latência • Bugs de dados compartilhados • Questão: • E se um dos dispositivos requer grande quantidade de tempo de processamento (maior do que a restrição de tempo de outros?) 24/03/2018 Pós-graduação em Internet das Coisas 196 RR+I e Fila de Funções • Em vez de ordem fixa, o programa gerencia a ordem de execução 1 #define DEV_1 1 2 #define DEV_2 2 3 ... 4 void interrupt handle_DEV_1() { 5 // deal with device 6 enqueue(DEV_1); 7 } 8 ... 9 void main() { 10 while (1) { 11 switch (dequeue()) { 12 case DEV_1: // process DEV_1 13 break; 14 ... 15 default: // empty queue nothing to do 16 } 17 } 18 } 24/03/2018 Pós-graduação em Internet das Coisas 197 RR+I e Fila de Funções • Pode-se usar ponteiros de função, mas eles adicionam complexidade • PF são úteis quando é desejado não fixar no loop principal a chamada dos códigos de tratamento de cada dispositivos • enqueue() reordena a fila para melhorar a latência de dispositivos de alta prioridade • Para funções de longa duração: divida-as em múltiplas unidades menores • Pergunta: isso melhora a latência? • Questão • Considere a implementação de dequeue(), que tipo de estrutura de dados você usaria (por que), é necessário um cuidado especial? 24/03/2018 Pós-graduação em Internet das Coisas 198 2◦ Trabalho 2◦ Trabalho Copie o projeto “round_robin_int” com o novo nome de “round_robin_ff” e implemente a arquitetura Round Robin com interrupções e fila de funções. Utilize um escalonador fifo onde só a tarefa das chaves tem prioridade sobre as outras. 1 utilize um enum para definir as tarefas: enum {t_ch_direita = 1, t_ch_esquerda, t_serial, t_adc, t_timer}; 2 Utilize as funções dequeue() e enqueue(). 24/03/2018 Pós-graduação em Internet das Coisas 199 Sistema Operacional de Tempo Real • Conta com operação de agendamento de tarefas • Controle de escalonamento preemptivo para garantir que os prazos sejam cumpridos 1 static pthread_t thread_1; 2 ... 3 void interrupt handle_DEV_1() { 4 // handle device 5 CHECK( pthread_wakeup(thread_1) ); 6 } 7 ... 8 void task_1() { 9 while (1) { 10 pthread_suspend_np(); 11 // process device 1 I/O 12 } 13 } 14 ... 24/03/2018 Pós-graduação em Internet das Coisas 200 Sistema Operacional de Tempo Real • O escalonador em um RTOS cuida do agendamento de todas as tarefas de acordo com sua prioridade • As tarefas de longa duração, de baixa prioridade, podem sofre preempção por tarefas de prioridades mais altas Todo código Todas tarfefas ISR Disp. 1 RR RR+I Maior Prioridade Menor Prioridade ISR Disp. 2 ISR Disp. 3 Tarfefa 1 ISR Disp. 1 RTOS ISR Disp. 2 ISR Disp. 3 Tarfefa 2 24/03/2018 Pós-graduação em Internet das Coisas 201 Sistema Operacional de Tempo Real • Serviços que um RTOS pode oferecer: • agendamento de tarefas • criar/terminar threads • operações de temporização de threads • preempção • Sincronização • semaforos e mutexes • Entrada/Saída • gerenciamento de interrupções • gerenciamento de memória • pilhas separadas • segmentação • alocação/desalocação • Sistema de arquivos • armazenamento persistente • Segurança • user vs. kernel space • gerenciamento de identidade 24/03/2018 Pós-graduação em Internet das Coisas 202 Conclusão • Arquiteturas de software descrevem a estrutura de um sistema independentemente da sua função • Round Robin é uma arquitetura simples para dispositivos com poucas (ou uniformes) restrições de temporização • Round Robin com Interrupções estende o RR com a utilização de interrupção de baixa latência • Round Robin com interrupções e filas de funções permite o agendamento dinâmico de tarefas sob controle programático • Os sistemas operacionais em tempo real aliviam os programadores de ter que lidar com agendamento e gerenciamento de tempo 24/03/2018 Pós-graduação em Internet das Coisas 203 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 I Instalação do Contiki-OS I Criando um Projeto do Contiki-OS no CCS I Entendendo o Programa I Copiando um Projeto Contiki no CCS I Entrada e Saída Serial I Acionamento de LEDs com o Event Timer I Eventos das Chaves I Conversor ADC I Acionamento PWM I Monitor de Tensão de Bateria e Temperatura I 3◦ Trabalho - Protocolo 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 07/04/2018 Pós-graduação em Internet das Coisas 204 SEXTA AULA Instalação do Contiki-OS. Criação de projetos utilizando o Contiki no CCS. Entrada e Saída Serial, acionamento de LEDs, leitura de chaves, conversor ADC, acionamento PWM e Monitor de Tensão de Bateria e Temperatura. 3◦ Trabalho. 07/04/2018 Pós-graduação em Internet das Coisas 205 Instalação do Contiki-OS http://www.contiki-os.org/ Instalação do Contiki-OS cd ~/workspace_v7git clone https://github.com/contiki-os/contiki.git cd contiki git submodule update --init sudo apt-get install gcc-arm-none-eabi srecord \ util-linux cutecom 07/04/2018 Pós-graduação em Internet das Coisas 206 Criando um Novo Projeto do Contiki-OS no CCS 07/04/2018 Pós-graduação em Internet das Coisas 207 Configuração do Projeto do Contiki-OS • Target: SimpleLink Wireless MCU CC2650F128 • Project Name: ctk_hello_world • Compiler Version: GNU • Output File: Executable • Project template: Empty project 07/04/2018 Pós-graduação em Internet das Coisas 208 Adicionando uma Pasta ao Projeto 07/04/2018 Pós-graduação em Internet das Coisas 209 Configurando o Nome da Pasta Nome da pasta: Source 07/04/2018 Pós-graduação em Internet das Coisas 210 Adicionando Arquivos 07/04/2018 Pós-graduação em Internet das Coisas 211 Selecionando os Arquivo de Configuração Baixe o arquivo ctk_hello_world.zip e descompacte. Adicione os arquivos ao projeto: • makefile.targets - makefile para “enganar” o CCS • Source/Makefile - Makefile do contiki • Source/Makefile.target - Configurações da placa utilizada • Source/ctk_hello_world.c - Exemplo inicial do Contiki 07/04/2018 Pós-graduação em Internet das Coisas 212 Configurando as Propriedades 07/04/2018 Pós-graduação em Internet das Coisas 213 Alterando as Opções Build->Behavior Acesse a janela Build->Behavior e modifique as opções para: contiki, contiki e contiki_clean. 07/04/2018 Pós-graduação em Internet das Coisas 214 Arquivo: makefile.targets O makefile.targets serve para “enganar” o CCS. Esse arquivo não precisa ser editado. Ele é chamado pelo CCS e simplesmente chama o Source/Makefile e copia o arquivo .elf gerado para pasta correta. • É necessário que o projeto e o arquivo principal.c tenham o mesmo nome! • Por ser tratar de um projeto do Contiki, as configurações do projeto no CCS não afetam a compilação! 1 contiki: 2 cd ../Source && $(MAKE) 3 cd ../Source && rename.ul .elf .out *.elf 4 mv ../Source/*.out . 5 6 contiki_clean: 7 cd ../Source && $(MAKE) clean 8 cd .. && rm -rf Debug/ 07/04/2018 Pós-graduação em Internet das Coisas 215 Arquivo: Source/Makefile O Makefile do Contiki deve ter o nome do projeto igual ao arquivo principal.c, as configurações específicas do projeto e o caminho para o Contiki. 1 CONTIKI_PROJECT = ctk_hello_world 2 all: $(CONTIKI_PROJECT) 3 4 CFLAGS += -g 5 6 CONTIKI = ../../contiki 7 include $(CONTIKI)/Makefile.include 07/04/2018 Pós-graduação em Internet das Coisas 216 Arquivo: Source/Makefile.target O arquivo Makefile.target guarda as configurações da plataforma utilizada pelo Contiki. Para uso com o launchpad não precisa ser editado. 1 TARGET = srf06-cc26xx 2 BOARD = launchpad/cc2650 07/04/2018 Pós-graduação em Internet das Coisas 217 Arquivo: Source/ctk_hello_world.c Exemplo inicial do Contiki 1 #include "contiki.h" 2 #include <stdio.h> /* For printf() */ 3 /*------------------------------------------------*/ 4 PROCESS(hello_world_process, "Hello world process"); 5 AUTOSTART_PROCESSES(&hello_world_process); 6 /*------------------------------------------------*/ 7 PROCESS_THREAD(hello_world_process, ev, data) 8 { 9 PROCESS_BEGIN(); 10 11 printf("Hello, world\n"); 12 13 PROCESS_END(); 14 } 15 /*------------------------------------------------*/ 07/04/2018 Pós-graduação em Internet das Coisas 218 Exercício 6.1- Compile e grave no launchpad o programa ctk_hello_world. Abra o terminal serial cutecom e verifique a saída do programa. 07/04/2018 Pós-graduação em Internet das Coisas 219 Copiando um Projeto Contiki no CCS Etapas para copiar e configurar o projeto: 1 Copie o projeto “ctk_hello_world” como “ctk...” 2 Renomeie o arquivo “ctk_hello_world.c” como “ctk....c” 3 Edite o Source/Makefile e modifique a variável: CONTIKI_PROJECT = ctk... 4 Opcional: Renomeie o processo no arquivo “ctk....c” 07/04/2018 Pós-graduação em Internet das Coisas 220 Entrada e Saída Serial Cabeçalho: 1 #include "dev/serial-line.h" 2 #include "dev/cc26xx-uart.h" 3 #include <stdio.h> /* For printf() */ Código: 1 PROCESS_BEGIN(); 2 cc26xx_uart_set_input(serial_line_input_byte); 3 printf("Start serial!\n"); 4 while(1) { 5 PROCESS_YIELD(); 6 if(ev == serial_line_event_message) { 7 printf("received line: %s\n", (char *)data); 8 } 9 } 10 PROCESS_END(); 07/04/2018 Pós-graduação em Internet das Coisas 221 Exercício 6.2- Copie o projeto ctk_hello_world como ctk_serial e modifique o código para que o envio das strings “liga” e “desliga” retornem as strings “ligado Ok” e “desligado Ok” respectivamente. Qualquer string diferente dessas enviada deve ser respondida com a string “comando inválido”. 07/04/2018 Pós-graduação em Internet das Coisas 222 Acionamento de LEDs com o Event Timer Cabeçalho: 1 #include "sys/etimer.h" 2 #include "dev/leds.h" Código: 1 static struct etimer timer; 2 while(1) 3 { 4 etimer_set(&timer, CLOCK_CONF_SECOND); 5 PROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER); 6 leds_toggle(LEDS_RED); 7 } 07/04/2018 Pós-graduação em Internet das Coisas 223 Exercício 6.3- Copie o projeto ctk_hello_world como ctk_simples e adicone o código para o LED vermelho ser acionado por um etimer a cada um segundo. 6.4- Crie outro processo com o LED verde piscando a cada 2 segundos. 07/04/2018 Pós-graduação em Internet das Coisas 224 Eventos das Chaves Cabeçalho: 1 #include "button-sensor.h" Código: 1 while (1) 2 { 3 PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event); 4 if (data == &button_left_sensor) 5 { 6 printf("Left: Pin %d, press duration %d clock ticks\n", 7 (&button_left_sensor)->value(BUTTON_SENSOR_VALUE_STATE), 8 (&button_left_sensor)->value(BUTTON_SENSOR_VALUE_DURATION)); 9 if ((&button_left_sensor)->value(BUTTON_SENSOR_VALUE_DURATION) 10 > CLOCK_SECOND) 11 { 12 printf("Long button press!\n"); 13 } 14 } 15 } 07/04/2018 Pós-graduação em Internet das Coisas 225 Exercício 6.5- Copie o projeto ctk_hello_world como ctk_botoes e altere o código para trocar o estado do LED vermelho a cada vez que a chave ficar mais de 2 segundos pressionada. Utilize o cutecom para ver as informações do acionamento. 07/04/2018 Pós-graduação em Internet das Coisas 226 Conversor ADC Cabeçalho: 1 #include "aux-ctrl.h" 2 #include "ti-lib.h" 3 static aux_consumer_module_t adc_aux = {.clocks = AUX_WUC_ADI_CLOCK | 4 AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK}; Código: 1 static int val,adj_val,adj_mv; 2 /* Request AUX access, with ADI and SMPH clocks */ 3 aux_ctrl_register_consumer(&adc_aux); 4 // Connect AUX IO7 (DIO23) as analog input. 5 ti_lib_aux_adc_select_input(ADC_COMPB_IN_AUXIO7); 6 ti_lib_aux_adc_enable_sync(AUXADC_REF_FIXED,AUXADC_SAMPLE_TIME_2P7_US, 7 AUXADC_TRIGGER_MANUAL); 8 ti_lib_aux_adc_gen_manual_trigger(); 9 val = ti_lib_aux_adc_read_fifo(); 10 adj_val = ti_lib_aux_adc_adjust_value_for_gain_and_offset( 11 val, 12 ti_lib_aux_adc_get_adjustment_gain(AUXADC_REF_FIXED), 13 ti_lib_aux_adc_get_adjustment_offset(AUXADC_REF_FIXED)); 07/04/2018 Pós-graduação em Internet das Coisas 227 Conversor ADC Continuação código: 14 adj_mv = ti_lib_aux_adc_value_to_microvolts( 15 AUXADC_FIXED_REF_VOLTAGE_NORMAL, adj_val); 16 ti_lib_aux_adc_disable(); 17 aux_ctrl_unregister_consumer(&adc_aux); 18 printf("ADC=%i\n",adj_mv); 07/04/2018 Pós-graduação em Internet das Coisas 228 Exercício 6.6- Copie o projeto ctk_hello_world como ctk_adc e altere o código para que faça uma medição do ADC a cada segundo usando um etimer. 07/04/2018 Pós-graduação em Internet das Coisas 229 Acionamento PWM Cabeçalho: 1 #include "ti-lib.h" 2 #include "lpm.h" 3 LPM_MODULE(pwm_module, NULL, NULL, NULL, LPM_DOMAIN_PERIPH); Configuração: 1 static uint32_tload, duty=0; 2 static uint32_t freq=10000; 3 // Enable GPT0 clocks under active, sleep, deep sleep 4 ti_lib_prcm_peripheral_run_enable(PRCM_PERIPH_TIMER0); 5 ti_lib_prcm_peripheral_sleep_enable(PRCM_PERIPH_TIMER0); 6 ti_lib_prcm_peripheral_deep_sleep_enable(PRCM_PERIPH_TIMER0); 7 ti_lib_prcm_load_set(); 8 while(!ti_lib_prcm_load_get()); 9 // Drive the I/O ID with GPT0 / Timer A 10 ti_lib_ioc_port_configure_set(BOARD_IOID_LED_1, IOC_PORT_MCU_PORT_EVENT0, 11 IOC_STD_OUTPUT); 12 // GPT0 / Timer A: PWM, Interrupt Enable 13 HWREG(GPT0_BASE + GPT_O_TAMR) = (TIMER_CFG_A_PWM&0xFF)|GPT_TAMR_TAPWMIE; 07/04/2018 Pós-graduação em Internet das Coisas 230 Acionamento PWM Continuação da configuração: 14 // Register ourself with LPM. This will keep the PERIPH PD 15 // powered on during deep sleep, allowing the buzzer to keep 16 //working while the chip is being power-cycled 17 lpm_register_module(&pwm_module); 18 // Stop the timer 19 ti_lib_timer_disable(GPT0_BASE, TIMER_A); 20 load = (GET_MCU_CLOCK / freq); 21 ti_lib_timer_load_set(GPT0_BASE, TIMER_A, load); 22 ti_lib_timer_match_set(GPT0_BASE, TIMER_A, 0); 23 /* Start */ 24 ti_lib_timer_enable(GPT0_BASE, TIMER_A); Código: 25 duty=load/2; 26 ti_lib_timer_match_set(GPT0_BASE, TIMER_A, load-duty); 07/04/2018 Pós-graduação em Internet das Coisas 231 Exercício 6.7- Copie o projeto ctk_hello_world como ctk_pwm e altere o código para que o PWM faça o LED vermelho variar o brilho de mínimo a máximo continuamente. Utilize um etimer para temporizar o incremento. 07/04/2018 Pós-graduação em Internet das Coisas 232 Monitor de Tensão de Bateria e Temperatura Cabeçalho: 1 #include "lib/sensors.h" 2 #include "batmon-sensor.h" Código: 1 SENSORS_ACTIVATE(batmon_sensor); 2 int value; 3 value = batmon_sensor.value(BATMON_SENSOR_TYPE_TEMP); 4 if(value != CC26XX_SENSOR_READING_ERROR) { 5 printf("Tem=%i\n",value); 6 } 7 value = batmon_sensor.value(BATMON_SENSOR_TYPE_VOLT); 8 if(value != CC26XX_SENSOR_READING_ERROR) { 9 printf("Bat=%i\n",(value * 125) >> 5); 10 } 07/04/2018 Pós-graduação em Internet das Coisas 233 Exercício 6.8- Copie o projeto ctk_hello_world como ctk_batmon e altere o código para que faça a medição dos valores de tensão da bateria e temperatura a cada segundo utilizando um etimer. 07/04/2018 Pós-graduação em Internet das Coisas 234 3◦ Trabalho Implemente o suporte ao protocolo descrito no arquivo serial.c sem modifica-lo no CC2650 utilizando o Contiki. Implemente o códigos das seguintes funções: void Serial_print (const char *str) void Serial_println(const char *str) int digitalRead(char pin) void digitalWrite(char pin, char value) void analogWrite(char pin,unsigned char value) int analogRead(char pin) Arquivo com as definições das funções: funcoes.c Os pinos que devem ser utilizados no trabalho são: • 7 - Saida Digital - LED verde • 13 - Entrada Digital - Chave esquerda • 6 - Saida Analógica - LED vermelho • 23 - Entrada Analógica - ADC 07/04/2018 Pós-graduação em Internet das Coisas 235 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 I Redes com o Contiki I Socket UDP I Socket TCP 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 14/04/2018 Pós-graduação em Internet das Coisas 236 SÉTIMA AULA tópicos 14/04/2018 Pós-graduação em Internet das Coisas 237 Redes com o Contiki 14/04/2018 Pós-graduação em Internet das Coisas 238 Socket UDP Cabeçalho: 1 Código: 1 14/04/2018 Pós-graduação em Internet das Coisas 239 Exercício 7.1- Copie o projeto ctk_hello_world como ctk_botoes e altere o código para 14/04/2018 Pós-graduação em Internet das Coisas 240 Socket TCP Cabeçalho: 1 Código: 1 14/04/2018 Pós-graduação em Internet das Coisas 241 Exercício 7.2- Copie o projeto ctk_hello_world como ctk_botoes e altere o código para 14/04/2018 Pós-graduação em Internet das Coisas 242 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 28/04/2018 Pós-graduação em Internet das Coisas 243 OITAVA AULA tópicos 28/04/2018 Pós-graduação em Internet das Coisas 244 Conteúdo 1 Primeira Aula - 24/02/2018 2 Segunda Aula - 03/03/2018 3 Terceira Aula - 10/03/2018 4 Quarta Aula - 17/03/2018 5 Quinta Aula - 24/03/2018 6 Sexta Aula - 07/04/2018 7 Sétima Aula - 14/04/2018 8 Oitava Aula - 28/04/2018 9 Nona Aula - 28/04/2018 I Finalização e apresentação do trabalho final 28/04/2018 Pós-graduação em Internet das Coisas 245 NONA AULA Finalização e apresentação do trabalho final 28/04/2018 Pós-graduação em Internet das Coisas 246 Primeira Aula - 24/02/2018 Introdução ao KICAD Utilização do KICAD Esquemático e PCB Captura de Esquemático Associação de Footprints Criação da PCB Segunda Aula - 03/03/2018 Plataforma LAUNCHXL-CC2650 IDE Code Composer Studio - CCS Compilando a Biblioteca CC26xxware Compilando um Projeto Simples Entendendo o Programa Depuração do Projeto Terceira Aula - 10/03/2018 ADC PWM Serial 1 Trabalho Quarta Aula - 17/03/2018 Monitor de Bateria e Temperatura Interrupção do Timer Interrupção do System Tick Interrupção dos Pinos Interrupção da Serial Quinta Aula - 24/03/2018 Interrupção do ADC Arquitetura de Software Embarcado Round Robin Round Robin com Interrupções Round Robin com Interrupções e Fila de Funções 2 Trabalho Sistema Operacional de Tempo Real Conclusão Sexta Aula - 07/04/2018 Instalação do Contiki-OS Criando um Projeto do Contiki-OS no CCS Entendendo o Programa Copiando um Projeto Contiki no CCS Entrada e Saída Serial Acionamento de LEDs com o Event Timer Eventos das Chaves Conversor ADC Acionamento PWM Monitor de Tensão de Bateria e Temperatura 3 Trabalho - Protocolo Sétima Aula - 14/04/2018 Redes com o Contiki Socket UDP Socket TCP Oitava Aula - 28/04/2018 Nona Aula - 28/04/2018 Finalização e apresentação do trabalho final
Compartilhar