Initial Commit

This commit is contained in:
seiichiro 2019-09-19 05:40:34 +02:00
commit d5b282ec58
48 changed files with 148050 additions and 0 deletions

4
Case/README.md Normal file
View File

@ -0,0 +1,4 @@
# TinyLoRa Case
A 3D-Printable Case for the TinyLora SMD PCB.
OpenSCAD Design and STL for direct 3D-Printing

34
Case/TinyLora.scad Normal file
View File

@ -0,0 +1,34 @@
$fn=100;
translate([5,43.5,50])rotate(a=[270,0,270]) union() {
difference() {
minkowski() {
cube(size=[36,47,16]);
translate([1,1,0]) sphere(2);
}
translate([1,1,6]) cube(size=[36,47,16]);
translate([1,21.5,1]) cube(size=[36,25.5,16]);
for(y=[20:+3:40]) {
translate([9.5,y,-5]) rotate(a=[-45,0,0]) cube(size=[9,0.9,10]);
translate([20,y,-5]) rotate(a=[-45,0,0]) cube(size=[9,0.9,10]);
}
translate([0.55,-1.5,14.5]) cube(size=[37.1,50,1]);
translate([1,-2,15.4]) cube(size=[36,50,1.2]);
translate([-4,-4,16.5]) cube(size=[60,60,2]);
}
translate([14.5,0.1,13.7]) rotate(a=[45,0,0]) cube(size=[9,1,1]);
}
translate([25,0,0]) difference() {
union() {
translate([0,0,0]) cube(size=[37,49.5,0.8]);
translate([0.6,0,0.8]) cube(size=[35.8,49,1.2]);
}
translate([13.5,0.9,-0.8]) rotate(a=[45,0,0]) cube(size=[10,1.1,1.1]);
translate([7,10,-2]) cylinder(r=1.75,h=5);
translate([7,10,-0.1]) cylinder(r1=3.5,r2=1.75,h=1.4);
translate([29.5,40,-2]) cylinder(r=1.75,h=5);
translate([29.5,40,-0.1]) cylinder(r1=3.7,r2=1.75,h=1.4);
translate([0,48,-1]) rotate(a=[0,0,60]) cube(size=[2,2,4]);
translate([37,48,-1]) rotate(a=[0,0,30]) cube(size=[2,2,4]);
}

59054
Case/TinyLora.stl Normal file

File diff suppressed because it is too large Load Diff

5
Firmware/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

7
Firmware/.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

6
Firmware/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"terminal.integrated.env.linux": {
"PATH": "/home/seiichiro/.platformio/penv/bin:/home/seiichiro/.platformio/penv:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl",
"PLATFORMIO_CALLER": "vscode"
}
}

4
Firmware/README.md Normal file
View File

@ -0,0 +1,4 @@
# TinyLoRa Firmware
Example Sensor Node Firmware with a BMP/E280 Sensor.
Please Change the Values in src/secconfig.h to your Keys from https://console.thethingsnetwork.org. Device has to be set to ABP Mode.

View File

@ -0,0 +1,157 @@
#include <Arduino.h>
#include <i2cmaster.h>
#include <stdint.h>
#include "BME280.h"
BME280::BME280() {
i2c_init();
getCalData();
}
void BME280::getCalData() {
dig_T1 = read16_LE(0x88);
dig_T2 = readS16_LE(0x8A);
dig_T3 = readS16_LE(0x8C);
dig_P1 = read16_LE(0x8E);
dig_P2 = readS16_LE(0x90);
dig_P3 = readS16_LE(0x92);
dig_P4 = readS16_LE(0x94);
dig_P5 = readS16_LE(0x96);
dig_P6 = readS16_LE(0x98);
dig_P7 = readS16_LE(0x9A);
dig_P8 = readS16_LE(0x9C);
dig_P9 = readS16_LE(0x9E);
dig_H1 = read8(0xA1);
dig_H2 = readS16_LE(0xE1);
dig_H3 = read8(0xE3);
dig_H4 = (read8(0xE4) << 4) | (read8(0xE5) & 0xF);
dig_H5 = (read8(0xE6) << 4) | (read8(0xE5) >> 4);
dig_H6 = (int8_t)read8(0xE7);
}
int32_t BME280::compensate_t(int32_t adc_T)
{
int32_t var1, var2, T;
var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
return T;
}
int32_t BME280::compensate_p(int32_t adc_P)
{
int32_t var1, var2;
uint32_t p;
var1 = (((int32_t)t_fine)>>1) -(int32_t)64000;
var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6);
var2 = var2 + ((var1*((int32_t)dig_P5))<<1);var2 = (var2>>2)+(((int32_t)dig_P4)<<16);
var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18;
var1 =((((32768+var1))*((int32_t)dig_P1))>>15);
if (var1 == 0) {
return 0;
}
p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;
if (p < 0x80000000) {
p = (p << 1) / ((uint32_t)var1);
} else {
p = (p / (uint32_t)var1) * 2;
}
var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;
var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13;
p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4));
return p;
}
int32_t BME280::compensate_h(int32_t adc_H)
{
int32_t v_x1_u32r;
v_x1_u32r=(t_fine-((int32_t)76800));
v_x1_u32r=(((((adc_H<<14)-(((int32_t)dig_H4)<<20)-(((int32_t)dig_H5)*v_x1_u32r))+
((int32_t)16384))>>15)*(((((((v_x1_u32r*((int32_t)dig_H6))>>10)*
(((v_x1_u32r*((int32_t)dig_H3))>>11)+((int32_t)32768)))>>10)+
((int32_t)2097152))*((int32_t)dig_H2)+8192)>>14));
v_x1_u32r=(v_x1_u32r-(((((v_x1_u32r>>15)*(v_x1_u32r>>15))>>7)*((int32_t)dig_H1))>>4));
v_x1_u32r=(v_x1_u32r < 0 ? 0 : v_x1_u32r);
v_x1_u32r=(v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
return (uint32_t)((v_x1_u32r>>12)/10);
}
void BME280::getData(int32_t *t, int32_t *p, int32_t *h) {
int32_t UP, UT, UH;
int32_t rawP, rawT;
// Trigger Measurement
// Set Sensor Config
write8(0xF2, 0b00000001); // 1x Oversampling for Humidity
write8(0xF4, 0b00100101); // 1x Oversampling for Temperature, Pressure, Forced Mode
delay(10);
// Read Pressure
rawP = read16(0xF7);
rawP <<= 8;
rawP |= read8(0xF9);
UP = rawP >> 4;
// Read Temperature
rawT = read16(0xFA);
rawT <<= 8;
rawT |= read8(0xFC);
UT = rawT >> 4;
// Read Humidity
UH = read16(0xFD);
// Compensate Values and Return
*t = compensate_t(UT);
*p = compensate_p(UP);
*h = compensate_h(UH);
}
uint8_t BME280::read8(uint8_t addr) {
i2c_start_wait(BME280_I2CADDR_WRITE);
i2c_write(addr);
i2c_rep_start(BME280_I2CADDR_READ);
uint8_t ret = i2c_readNak();
i2c_stop();
return ret;
}
uint16_t BME280::read16(uint8_t addr) {
i2c_start_wait(BME280_I2CADDR_WRITE);
i2c_write(addr);
i2c_rep_start(BME280_I2CADDR_READ);
uint16_t ret = i2c_readAck();
ret <<= 8;
ret |= i2c_readNak();
i2c_stop();
return ret;
}
uint16_t BME280::read16_LE(uint8_t addr) {
uint16_t temp = read16(addr);
return (temp >> 8) | (temp << 8);
}
int16_t BME280::readS16(uint8_t addr) {
return (int16_t)read16(addr);
}
int16_t BME280::readS16_LE(uint8_t addr) {
return (int16_t)read16_LE(addr);
}
void BME280::write8(uint8_t addr, uint8_t data) {
i2c_start_wait(BME280_I2CADDR_WRITE);
i2c_write(addr);
i2c_write(data);
i2c_stop();
}

View File

@ -0,0 +1,43 @@
#ifndef BME280_H
#define BME280_H
#include <stdint.h>
#define BME280_I2CADDR_READ 0xED
#define BME280_I2CADDR_WRITE 0xEC
class BME280
{
private:
// Variables for Calibration Values
uint8_t dig_H1, dig_H3;
int8_t dig_H6;
uint16_t dig_T1, dig_P1;
int16_t dig_T2, dig_T3, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9, dig_H2, dig_H4, dig_H5;
// Helper Variable
int32_t t_fine;
// Functions for Calculation compensated Values
int32_t compensate_t(int32_t);
int32_t compensate_p(int32_t);
int32_t compensate_h(int32_t);
// Helper Functions for Reading / Writing I2C Data
uint8_t read8(uint8_t addr);
uint16_t read16(uint8_t addr);
uint16_t read16_LE(uint8_t addr);
int16_t readS16(uint8_t addr);
int16_t readS16_LE(uint8_t addr);
void write8(uint8_t addr, uint8_t data);
public:
BME280(void);
// Get Calibration Data from Sensor
void getCalData(void);
// Read Pressure From Sensor
void getData(int32_t *t, int32_t *p, int32_t *h);
};
#endif

View File

@ -0,0 +1,689 @@
/*
LoRaWAN.cpp - Library for LoRaWAN protocol, uses RFM95W module
Created by Leo Korbee, March 31, 2018.
Released into the public domain.
@license Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Thanks to all the folks who contributed on the base of this code.
(Gerben den Hartog, et al - Ideetron.nl)
*/
#include "Arduino.h"
#include "LoRaWAN.h"
// constructor
LoRaWAN::LoRaWAN(RFM95 &rfm95)
{
_rfm95 = &rfm95;
}
void LoRaWAN::setKeys(unsigned char NwkSkey[], unsigned char AppSkey[], unsigned char DevAddr[])
{
_NwkSkey = NwkSkey;
_AppSkey = AppSkey;
_DevAddr = DevAddr;
}
/*
*****************************************************************************************
* Description : Function contstructs a LoRaWAN package and sends it
*
* Arguments : *Data pointer to the array of data that will be transmitted
* Data_Length nuber of bytes to be transmitted
* Frame_Counter_Up Frame counter of upstream frames
*
*****************************************************************************************
*/
void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx)
{
//Define variables
unsigned char i;
//Direction of frame is up
unsigned char Direction = 0x00;
unsigned char RFM_Data[64];
unsigned char RFM_Package_Length;
unsigned char MIC[4];
/*
@leo:
https://hackmd.io/s/S1kg6Ymo-
75 bits 42 bits 10 bits
MType RFU Major
MType Description
000 (0x00) Join Request
001 (0x20) Join Accept
010 (0x40) Unconfirmed Data Up
011 (0x60) Unconfirmed Data Down
100 (0x80) Confirmed Data Up
101 (0xA0) Confirmed Data Down
110 (0xC0) RFU
111 (0xE0) Proprietary
*/
// Unconfirmed data up
unsigned char Mac_Header = 0x40;
// Confirmed data up
// unsigned char Mac_Header = 0x80;
unsigned char Frame_Control = 0x00;
unsigned char Frame_Port = 0x01;
//Encrypt the data
Encrypt_Payload(Data, Data_Length, Frame_Counter_Tx, Direction);
//Build the Radio Package
RFM_Data[0] = Mac_Header;
RFM_Data[1] = _DevAddr[3];
RFM_Data[2] = _DevAddr[2];
RFM_Data[3] = _DevAddr[1];
RFM_Data[4] = _DevAddr[0];
RFM_Data[5] = Frame_Control;
RFM_Data[6] = (Frame_Counter_Tx & 0x00FF);
RFM_Data[7] = ((Frame_Counter_Tx >> 8) & 0x00FF);
RFM_Data[8] = Frame_Port;
//Set Current package length
RFM_Package_Length = 9;
//Load Data
for(i = 0; i < Data_Length; i++)
{
RFM_Data[RFM_Package_Length + i] = Data[i];
}
//Add data Lenth to package length
RFM_Package_Length = RFM_Package_Length + Data_Length;
//Calculate MIC
Calculate_MIC(RFM_Data, MIC, RFM_Package_Length, Frame_Counter_Tx, Direction);
//Load MIC in package
for(i = 0; i < 4; i++)
{
RFM_Data[i + RFM_Package_Length] = MIC[i];
}
//Add MIC length to RFM package length
RFM_Package_Length = RFM_Package_Length + 4;
//Send Package
_rfm95->RFM_Send_Package(RFM_Data, RFM_Package_Length);
}
/*
Encryption stuff after this line
*/
void LoRaWAN::Encrypt_Payload(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter, unsigned char Direction)
{
unsigned char i = 0x00;
unsigned char j;
unsigned char Number_of_Blocks = 0x00;
unsigned char Incomplete_Block_Size = 0x00;
unsigned char Block_A[16];
//Calculate number of blocks
Number_of_Blocks = Data_Length / 16;
Incomplete_Block_Size = Data_Length % 16;
if(Incomplete_Block_Size != 0)
{
Number_of_Blocks++;
}
for(i = 1; i <= Number_of_Blocks; i++)
{
Block_A[0] = 0x01;
Block_A[1] = 0x00;
Block_A[2] = 0x00;
Block_A[3] = 0x00;
Block_A[4] = 0x00;
Block_A[5] = Direction;
Block_A[6] = _DevAddr[3];
Block_A[7] = _DevAddr[2];
Block_A[8] = _DevAddr[1];
Block_A[9] = _DevAddr[0];
Block_A[10] = (Frame_Counter & 0x00FF);
Block_A[11] = ((Frame_Counter >> 8) & 0x00FF);
Block_A[12] = 0x00; //Frame counter upper Bytes
Block_A[13] = 0x00;
Block_A[14] = 0x00;
Block_A[15] = i;
//Calculate S
AES_Encrypt(Block_A, _AppSkey); //original
//Check for last block
if(i != Number_of_Blocks)
{
for(j = 0; j < 16; j++)
{
*Data = *Data ^ Block_A[j];
Data++;
}
}
else
{
if(Incomplete_Block_Size == 0)
{
Incomplete_Block_Size = 16;
}
for(j = 0; j < Incomplete_Block_Size; j++)
{
*Data = *Data ^ Block_A[j];
Data++;
}
}
}
}
void LoRaWAN::Calculate_MIC(unsigned char *Data, unsigned char *Final_MIC, unsigned char Data_Length, unsigned int Frame_Counter, unsigned char Direction)
{
unsigned char i;
unsigned char Block_B[16];
unsigned char Key_K1[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char Key_K2[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//unsigned char Data_Copy[16];
unsigned char Old_Data[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char New_Data[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char Number_of_Blocks = 0x00;
unsigned char Incomplete_Block_Size = 0x00;
unsigned char Block_Counter = 0x01;
//Create Block_B
Block_B[0] = 0x49;
Block_B[1] = 0x00;
Block_B[2] = 0x00;
Block_B[3] = 0x00;
Block_B[4] = 0x00;
Block_B[5] = Direction;
Block_B[6] = _DevAddr[3];
Block_B[7] = _DevAddr[2];
Block_B[8] = _DevAddr[1];
Block_B[9] = _DevAddr[0];
Block_B[10] = (Frame_Counter & 0x00FF);
Block_B[11] = ((Frame_Counter >> 8) & 0x00FF);
Block_B[12] = 0x00; //Frame counter upper bytes
Block_B[13] = 0x00;
Block_B[14] = 0x00;
Block_B[15] = Data_Length;
//Calculate number of Blocks and blocksize of last block
Number_of_Blocks = Data_Length / 16;
Incomplete_Block_Size = Data_Length % 16;
if(Incomplete_Block_Size != 0)
{
Number_of_Blocks++;
}
Generate_Keys(Key_K1, Key_K2);
//Preform Calculation on Block B0
//Preform AES encryption
AES_Encrypt(Block_B, _NwkSkey);
//Copy Block_B to Old_Data
for(i = 0; i < 16; i++)
{
Old_Data[i] = Block_B[i];
}
//Preform full calculating until n-1 messsage blocks
while(Block_Counter < Number_of_Blocks)
{
//Copy data into array
for(i = 0; i < 16; i++)
{
New_Data[i] = *Data;
Data++;
}
//Preform XOR with old data
XOR(New_Data,Old_Data);
//Preform AES encryption
AES_Encrypt(New_Data, _NwkSkey);
//Copy New_Data to Old_Data
for(i = 0; i < 16; i++)
{
Old_Data[i] = New_Data[i];
}
//Raise Block counter
Block_Counter++;
}
//Perform calculation on last block
//Check if Datalength is a multiple of 16
if(Incomplete_Block_Size == 0)
{
//Copy last data into array
for(i = 0; i < 16; i++)
{
New_Data[i] = *Data;
Data++;
}
//Preform XOR with Key 1
XOR(New_Data,Key_K1);
//Preform XOR with old data
XOR(New_Data,Old_Data);
//Preform last AES routine
// read NwkSkey from PROGMEM
AES_Encrypt(New_Data, _NwkSkey);
}
else
{
//Copy the remaining data and fill the rest
for(i = 0; i < 16; i++)
{
if(i < Incomplete_Block_Size)
{
New_Data[i] = *Data;
Data++;
}
if(i == Incomplete_Block_Size)
{
New_Data[i] = 0x80;
}
if(i > Incomplete_Block_Size)
{
New_Data[i] = 0x00;
}
}
//Preform XOR with Key 2
XOR(New_Data,Key_K2);
//Preform XOR with Old data
XOR(New_Data,Old_Data);
//Preform last AES routine
AES_Encrypt(New_Data, _NwkSkey);
}
Final_MIC[0] = New_Data[0];
Final_MIC[1] = New_Data[1];
Final_MIC[2] = New_Data[2];
Final_MIC[3] = New_Data[3];
}
void LoRaWAN::Generate_Keys(unsigned char *K1, unsigned char *K2)
{
unsigned char i;
unsigned char MSB_Key;
//Encrypt the zeros in K1 with the NwkSkey
AES_Encrypt(K1,_NwkSkey);
//Create K1
//Check if MSB is 1
if((K1[0] & 0x80) == 0x80)
{
MSB_Key = 1;
}
else
{
MSB_Key = 0;
}
//Shift K1 one bit left
Shift_Left(K1);
//if MSB was 1
if(MSB_Key == 1)
{
K1[15] = K1[15] ^ 0x87;
}
//Copy K1 to K2
for( i = 0; i < 16; i++)
{
K2[i] = K1[i];
}
//Check if MSB is 1
if((K2[0] & 0x80) == 0x80)
{
MSB_Key = 1;
}
else
{
MSB_Key = 0;
}
//Shift K2 one bit left
Shift_Left(K2);
//Check if MSB was 1
if(MSB_Key == 1)
{
K2[15] = K2[15] ^ 0x87;
}
}
void LoRaWAN::Shift_Left(unsigned char *Data)
{
unsigned char i;
unsigned char Overflow = 0;
//unsigned char High_Byte, Low_Byte;
for(i = 0; i < 16; i++)
{
//Check for overflow on next byte except for the last byte
if(i < 15)
{
//Check if upper bit is one
if((Data[i+1] & 0x80) == 0x80)
{
Overflow = 1;
}
else
{
Overflow = 0;
}
}
else
{
Overflow = 0;
}
//Shift one left
Data[i] = (Data[i] << 1) + Overflow;
}
}
void LoRaWAN::XOR(unsigned char *New_Data,unsigned char *Old_Data)
{
unsigned char i;
for(i = 0; i < 16; i++)
{
New_Data[i] = New_Data[i] ^ Old_Data[i];
}
}
/*
*****************************************************************************************
* Title : AES_Encrypt
* Description :
*****************************************************************************************
*/
void LoRaWAN::AES_Encrypt(unsigned char *Data, unsigned char *Key)
{
unsigned char Row, Column, Round = 0;
unsigned char Round_Key[16];
unsigned char State[4][4];
// Copy input to State arry
for( Column = 0; Column < 4; Column++ )
{
for( Row = 0; Row < 4; Row++ )
{
State[Row][Column] = Data[Row + (Column << 2)];
}
}
// Copy key to round key
memcpy( &Round_Key[0], &Key[0], 16 );
// Add round key
AES_Add_Round_Key( Round_Key, State );
// Preform 9 full rounds with mixed collums
for( Round = 1 ; Round < 10 ; Round++ )
{
// Perform Byte substitution with S table
for( Column = 0 ; Column < 4 ; Column++ )
{
for( Row = 0 ; Row < 4 ; Row++ )
{
State[Row][Column] = AES_Sub_Byte( State[Row][Column] );
}
}
// Perform Row Shift
AES_Shift_Rows(State);
// Mix Collums
AES_Mix_Collums(State);
// Calculate new round key
AES_Calculate_Round_Key(Round, Round_Key);
// Add the round key to the Round_key
AES_Add_Round_Key(Round_Key, State);
}
// Perform Byte substitution with S table whitout mix collums
for( Column = 0 ; Column < 4 ; Column++ )
{
for( Row = 0; Row < 4; Row++ )
{
State[Row][Column] = AES_Sub_Byte(State[Row][Column]);
}
}
// Shift rows
AES_Shift_Rows(State);
// Calculate new round key
AES_Calculate_Round_Key( Round, Round_Key );
// Add round key
AES_Add_Round_Key( Round_Key, State );
// Copy the State into the data array
for( Column = 0; Column < 4; Column++ )
{
for( Row = 0; Row < 4; Row++ )
{
Data[Row + (Column << 2)] = State[Row][Column];
}
}
} // AES_Encrypt
/*
*****************************************************************************************
* Title : AES_Add_Round_Key
* Description :
*****************************************************************************************
*/
void LoRaWAN::AES_Add_Round_Key(unsigned char *Round_Key, unsigned char (*State)[4])
{
unsigned char Row, Collum;
for(Collum = 0; Collum < 4; Collum++)
{
for(Row = 0; Row < 4; Row++)
{
State[Row][Collum] ^= Round_Key[Row + (Collum << 2)];
}
}
} // AES_Add_Round_Key
/*
*****************************************************************************************
* Title : AES_Sub_Byte
* Description :
*****************************************************************************************
*/
unsigned char LoRaWAN::AES_Sub_Byte(unsigned char Byte)
{
// unsigned char S_Row,S_Collum;
// unsigned char S_Byte;
//
// S_Row = ((Byte >> 4) & 0x0F);
// S_Collum = ((Byte >> 0) & 0x0F);
// S_Byte = S_Table [S_Row][S_Collum];
//return S_Table [ ((Byte >> 4) & 0x0F) ] [ ((Byte >> 0) & 0x0F) ]; // original
return pgm_read_byte(&(S_Table [((Byte >> 4) & 0x0F)] [((Byte >> 0) & 0x0F)]));
} // AES_Sub_Byte
/*
*****************************************************************************************
* Title : AES_Shift_Rows
* Description :
*****************************************************************************************
*/
void LoRaWAN::AES_Shift_Rows(unsigned char (*State)[4])
{
unsigned char Buffer;
//Store firt byte in buffer
Buffer = State[1][0];
//Shift all bytes
State[1][0] = State[1][1];
State[1][1] = State[1][2];
State[1][2] = State[1][3];
State[1][3] = Buffer;
Buffer = State[2][0];
State[2][0] = State[2][2];
State[2][2] = Buffer;
Buffer = State[2][1];
State[2][1] = State[2][3];
State[2][3] = Buffer;
Buffer = State[3][3];
State[3][3] = State[3][2];
State[3][2] = State[3][1];
State[3][1] = State[3][0];
State[3][0] = Buffer;
} // AES_Shift_Rows
/*
*****************************************************************************************
* Title : AES_Mix_Collums
* Description :
*****************************************************************************************
*/
void LoRaWAN::AES_Mix_Collums(unsigned char (*State)[4])
{
unsigned char Row,Collum;
unsigned char a[4], b[4];
for(Collum = 0; Collum < 4; Collum++)
{
for(Row = 0; Row < 4; Row++)
{
a[Row] = State[Row][Collum];
b[Row] = (State[Row][Collum] << 1);
if((State[Row][Collum] & 0x80) == 0x80)
{
b[Row] ^= 0x1B;
}
}
State[0][Collum] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3];
State[1][Collum] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3];
State[2][Collum] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3];
State[3][Collum] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3];
}
} // AES_Mix_Collums
/*
*****************************************************************************************
* Title : AES_Calculate_Round_Key
* Description :
*****************************************************************************************
*/
void LoRaWAN::AES_Calculate_Round_Key(unsigned char Round, unsigned char *Round_Key)
{
unsigned char i, j, b, Rcon;
unsigned char Temp[4];
//Calculate Rcon
Rcon = 0x01;
while(Round != 1)
{
b = Rcon & 0x80;
Rcon = Rcon << 1;
if(b == 0x80)
{
Rcon ^= 0x1b;
}
Round--;
}
// Calculate first Temp
// Copy laste byte from previous key and subsitute the byte, but shift the array contents around by 1.
Temp[0] = AES_Sub_Byte( Round_Key[12 + 1] );
Temp[1] = AES_Sub_Byte( Round_Key[12 + 2] );
Temp[2] = AES_Sub_Byte( Round_Key[12 + 3] );
Temp[3] = AES_Sub_Byte( Round_Key[12 + 0] );
// XOR with Rcon
Temp[0] ^= Rcon;
// Calculate new key
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
Round_Key[j + (i << 2)] ^= Temp[j];
Temp[j] = Round_Key[j + (i << 2)];
}
}
} // AES_Calculate_Round_Key

View File

@ -0,0 +1,70 @@
/*
LoRaWAN.h - Library header file for LoRaWAN protocol, uses RFM95W module
Created by Leo Korbee, March 31, 2018.
Released into the public domain.
@license Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Thanks to all the folks who contributed before me on this code.
*/
#include "RFM95.h"
#include "Arduino.h"
#ifndef LoRaWAN_h
#define LoRaWAN_h
// for AES encryption
static const unsigned char PROGMEM S_Table[16][16] = {
{0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76},
{0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0},
{0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15},
{0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75},
{0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84},
{0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF},
{0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8},
{0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2},
{0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73},
{0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB},
{0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79},
{0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08},
{0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A},
{0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E},
{0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF},
{0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16}
};
class LoRaWAN
{
public:
LoRaWAN(RFM95 &rfm95);
void setKeys(unsigned char NwkSkey[], unsigned char AppSkey[], unsigned char DevAddr[]);
void Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx);
private:
RFM95 *_rfm95;
// remember arrays are pointers!
unsigned char *_NwkSkey;
unsigned char *_AppSkey;
unsigned char *_DevAddr;
void RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length);
// security stuff:
void Encrypt_Payload(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter, unsigned char Direction);
void Calculate_MIC(unsigned char *Data, unsigned char *Final_MIC, unsigned char Data_Length, unsigned int Frame_Counter, unsigned char Direction);
void Generate_Keys(unsigned char *K1, unsigned char *K2);
void Shift_Left(unsigned char *Data);
void XOR(unsigned char *New_Data,unsigned char *Old_Data);
void AES_Encrypt(unsigned char *Data, unsigned char *Key);
void AES_Add_Round_Key(unsigned char *Round_Key, unsigned char (*State)[4]);
unsigned char AES_Sub_Byte(unsigned char Byte);
void AES_Shift_Rows(unsigned char (*State)[4]);
void AES_Mix_Collums(unsigned char (*State)[4]);
void AES_Calculate_Round_Key(unsigned char Round, unsigned char *Round_Key);
};
#endif

View File

@ -0,0 +1,281 @@
/*
RFM95.cpp - Library for RFM95 LoRa module.
Created by Leo Korbee, March 31, 2018.
Released into the public domain.
@license Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Thanks to all the folks who contributed on the base of this code.
(Gerben den Hartog, et al - Ideetron.nl)
*/
#include "Arduino.h"
#include "RFM95.h"
#include <tinySPI.h>
// constructor
RFM95::RFM95(int DIO0, int NSS)
{
_DIO0 = DIO0;
_NSS = NSS;
// init tinySPI
SPI.setDataMode(SPI_MODE0);
SPI.begin();
}
/*
*****************************************************************************************
* Description: Function used to initialize the RFM module on startup
*****************************************************************************************
*/
void RFM95::init()
{
// set pinmodes input/output
pinMode(_NSS, OUTPUT);
pinMode(_DIO0, INPUT);
// NSS for starting and stopping communication with the RFM95 module
digitalWrite(_NSS, HIGH);
//Switch RFM to sleep
RFM_Write(0x01,0x00);
//Set RFM in LoRa mode
RFM_Write(0x01,0x80);
//Set RFM in Standby mode wait on mode ready
RFM_Write(0x01,0x81);
/*
while (digitalRead(DIO5) == LOW)
{
}
*/
delay(10);
//Set carrair frequency
// 868.100 MHz / 61.035 Hz = 14222987 = 0xD9068B
RFM_Write(0x06,0xD9);
RFM_Write(0x07,0x06);
RFM_Write(0x08,0x8B);
//PA pin (maximal power)
RFM_Write(0x09,0xFF);
//BW = 125 kHz, Coding rate 4/5, Explicit header mode
RFM_Write(0x1D,0x72);
//Spreading factor 7, PayloadCRC On
RFM_Write(0x1E,0xB4);
//Rx Timeout set to 37 symbols
RFM_Write(0x1F,0x25);
//Preamble length set to 8 symbols
//0x0008 + 4 = 12
RFM_Write(0x20,0x00);
RFM_Write(0x21,0x08);
//Low datarate optimization off AGC auto on
RFM_Write(0x26,0x0C);
//Set LoRa sync word
RFM_Write(0x39,0x34);
//Set IQ to normal values
RFM_Write(0x33,0x27);
RFM_Write(0x3B,0x1D);
//Set FIFO pointers
//TX base adress
RFM_Write(0x0E,0x80);
//Rx base adress
RFM_Write(0x0F,0x00);
//Switch RFM to sleep
RFM_Write(0x01,0x00);
}
/*
*****************************************************************************************
* Description : Funtion that writes a register from the RFM
*
* Arguments : RFM_Address Address of register to be written
* RFM_Data Data to be written
*****************************************************************************************
*/
void RFM95::RFM_Write(unsigned char RFM_Address, unsigned char RFM_Data)
{
//Set NSS pin Low to start communication
digitalWrite(_NSS,LOW);
//Send Addres with MSB 1 to make it a write command
SPI.transfer(RFM_Address | 0x80);
//Send Data
SPI.transfer(RFM_Data);
//Set NSS pin High to end communication
digitalWrite(_NSS,HIGH);
}
/*
*****************************************************************************************
* Description : Funtion that reads a register from the RFM and returns the value
*
* Arguments : RFM_Address Address of register to be read
*
* Returns : Value of the register
*****************************************************************************************
*/
unsigned char RFM95::RFM_Read(unsigned char RFM_Address)
{
unsigned char RFM_Data;
//Set NSS pin low to start SPI communication
digitalWrite(_NSS,LOW);
//Send Address
SPI.transfer(RFM_Address);
//Send 0x00 to be able to receive the answer from the RFM
RFM_Data = SPI.transfer(0x00);
//Set NSS high to end communication
digitalWrite(_NSS,HIGH);
//Return received data
return RFM_Data;
}
/*
*****************************************************************************************
* Description : Function for sending a package with the RFM
*
* Arguments : *RFM_Tx_Package Pointer to arry with data to be send
* Package_Length Length of the package to send
*****************************************************************************************
*/
void RFM95::RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length)
{
unsigned char i;
// unsigned char RFM_Tx_Location = 0x00;
//Set RFM in Standby mode wait on mode ready
RFM_Write(0x01,0x81);
/*
while (digitalRead(DIO5) == LOW)
{
}
*/
delay(10);
//Switch DIO0 to TxDone
//RFM_Write(0x40,0x40);
//Set carrier frequency
/*
fixed frequency
// 868.100 MHz / 61.035 Hz = 14222987 = 0xD9068B
_rfm95.RFM_Write(0x06,0xD9);
_rfm95.RFM_Write(0x07,0x06);
_rfm95.RFM_Write(0x08,0x8B);
*/
// TCNT0 is timer0 continous timer, kind of random selection of frequency
// EU863-870 specifications
switch (TCNT0 % 8)
{
case 0x00: //Channel 0 868.100 MHz / 61.035 Hz = 14222987 = 0xD9068B
RFM_Write(0x06,0xD9);
RFM_Write(0x07,0x06);
RFM_Write(0x08,0x8B);
break;
case 0x01: //Channel 1 868.300 MHz / 61.035 Hz = 14226264 = 0xD91358
RFM_Write(0x06,0xD9);
RFM_Write(0x07,0x13);
RFM_Write(0x08,0x58);
break;
case 0x02: //Channel 2 868.500 MHz / 61.035 Hz = 14229540 = 0xD92024
RFM_Write(0x06,0xD9);
RFM_Write(0x07,0x20);
RFM_Write(0x08,0x24);
break;
// added five more channels
case 0x03: // Channel 3 867.100 MHz / 61.035 Hz = 14206603 = 0xD8C68B
RFM_Write(0x06,0xD8);
RFM_Write(0x07,0xC6);
RFM_Write(0x08,0x8B);
break;
case 0x04: // Channel 4 867.300 MHz / 61.035 Hz = 14209880 = 0xD8D358
RFM_Write(0x06,0xD8);
RFM_Write(0x07,0xD3);
RFM_Write(0x08,0x58);
break;
case 0x05: // Channel 5 867.500 MHz / 61.035 Hz = 14213156 = 0xD8E024
RFM_Write(0x06,0xD8);
RFM_Write(0x07,0xE0);
RFM_Write(0x08,0x24);
break;
case 0x06: // Channel 6 867.700 MHz / 61.035 Hz = 14216433 = 0xD8ECF1
RFM_Write(0x06,0xD8);
RFM_Write(0x07,0xEC);
RFM_Write(0x08,0xF1);
break;
case 0x07: // Channel 7 867.900 MHz / 61.035 Hz = 14219710 = 0xD8F9BE
RFM_Write(0x06,0xD8);
RFM_Write(0x07,0xF9);
RFM_Write(0x08,0xBE);
break;
// FSK 868.800 Mhz => not used in this config
// 869.525 - SF9BW125 (RX2 downlink only) for package received
}
//SF7 BW 125 kHz
RFM_Write(0x1E,0x74); //SF7 CRC On
RFM_Write(0x1D,0x72); //125 kHz 4/5 coding rate explicit header mode
RFM_Write(0x26,0x04); //Low datarate optimization off AGC auto on
//Set IQ to normal values
RFM_Write(0x33,0x27);
RFM_Write(0x3B,0x1D);
//Set payload length to the right length
RFM_Write(0x22,Package_Length);
//Get location of Tx part of FiFo
//RFM_Tx_Location = RFM_Read(0x0E);
//Set SPI pointer to start of Tx part in FiFo
//RFM_Write(0x0D,RFM_Tx_Location);
RFM_Write(0x0D,0x80); // hardcoded fifo location according RFM95 specs
//Write Payload to FiFo
for (i = 0;i < Package_Length; i++)
{
RFM_Write(0x00,*RFM_Tx_Package);
RFM_Tx_Package++;
}
//Switch RFM to Tx
RFM_Write(0x01,0x83);
//Wait for TxDone
//while( digitalRead(_DIO0) == LOW )
//{
//}
while((RFM_Read(0x12) & 0x08) != 0x08)
{
}
//Clear interrupt
RFM_Write(0x12,0x08);
//Switch RFM to sleep
RFM_Write(0x01,0x00);
}

View File

@ -0,0 +1,29 @@
/*
RFM95.h - Library header file for RFM95 LoRa module.
Created by Leo Korbee, March 31, 2018.
Released into the public domain.
@license Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Thanks to all the folks who contributed beforme me on this code.
*/
#ifndef RFM95_h
#define RMF95_h
#include "Arduino.h"
class RFM95
{
public:
RFM95(int DIO0, int NSS);
void init();
void RFM_Write(unsigned char RFM_Address, unsigned char RFM_Data);
unsigned char RFM_Read(unsigned char RFM_Address);
void RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length);
private:
int _DIO0;
int _NSS;
};
#endif

View File

@ -0,0 +1,306 @@
;*************************************************************************
; Title : I2C (Single) Master Implementation
; Author: Peter Fleury <pfleury@gmx.ch>
; based on Atmel Appl. Note AVR300
; File: $Id: i2cmaster.S,v 1.13 2015/09/16 11:21:00 peter Exp $
; Software: AVR-GCC 4.x
; Target: any AVR device
;
; DESCRIPTION
; Basic routines for communicating with I2C slave devices. This
; "single" master implementation is limited to one bus master on the
; I2C bus.
;
; Based on the Atmel Application Note AVR300, corrected and adapted
; to GNU assembler and AVR-GCC C call interface
; Replaced the incorrect quarter period delays found in AVR300 with
; half period delays.
;
; USAGE
; These routines can be called from C, refere to file i2cmaster.h.
; See example test_i2cmaster.c
; Adapt the SCL and SDA port and pin definitions and eventually
; the delay routine to your target !
; Use 4.7k pull-up resistor on the SDA and SCL pin.
;
; NOTES
; The I2C routines can be called either from non-interrupt or
; interrupt routines, not both.
;
;*************************************************************************
#include <avr/io.h>
#undef SCL_PORT
#undef SCL_DDR
;******----- Adapt these SCA and SCL port and pin definition to your target !!
;
#define SDA 1 // SDA Port A, Pin 1
#define SCL 0 // SCL Port A, Pin 2
#define SDA_PORT PORTA // SDA Port A
#define SCL_PORT PORTA // SCL Port A
;******----------------------------------------------------------------------
;-- map the IO register back into the IO address space
#define SDA_DDR (_SFR_IO_ADDR(SDA_PORT) - 1)
#define SCL_DDR (_SFR_IO_ADDR(SCL_PORT) - 1)
#define SDA_OUT _SFR_IO_ADDR(SDA_PORT)
#define SCL_OUT _SFR_IO_ADDR(SCL_PORT)
#define SDA_IN (_SFR_IO_ADDR(SDA_PORT) - 2)
#define SCL_IN (_SFR_IO_ADDR(SCL_PORT) - 2)
#ifndef __tmp_reg__
#define __tmp_reg__ 0
#endif
.section .text
;*************************************************************************
; delay half period
; For I2C in normal mode (100kHz), use T/2 > 5us
; For I2C in fast mode (400kHz), use T/2 > 1.25us
;*************************************************************************
.stabs "",100,0,0,i2c_delay_T2
.stabs "i2cmaster.S",100,0,0,i2c_delay_T2
.func i2c_delay_T2 ; delay 5.0 microsec with 8 Mhz crystal
i2c_delay_T2:
rcall i2c_delay_20cycles
rjmp i2c_delay_20cycles
.endfunc ; total 40 cyles = 5.0 microsec with 8 Mhz crystal
.func i2c_delay_20cycles ; 4 cycles
i2c_delay_20cycles:
rjmp 1f ; 2 "
1: rjmp 2f ; 2 "
2: rjmp 3f ; 2 "
3: rjmp 4f ; 2 "
4: rjmp 5f ; 2 "
5: rjmp 6f ; 2 "
6: nop ; 1 "
ret ; 3 "
.endfunc ; total 20 cyles
;*************************************************************************
; Initialization of the I2C bus interface. Need to be called only once
;
; extern void i2c_init(void)
;*************************************************************************
.global i2c_init
.func i2c_init
i2c_init:
cbi SDA_DDR,SDA ;release SDA
cbi SCL_DDR,SCL ;release SCL
cbi SDA_OUT,SDA
cbi SCL_OUT,SCL
ret
.endfunc
;*************************************************************************
; Issues a start condition and sends address and transfer direction.
; return 0 = device accessible, 1= failed to access device
;
; extern unsigned char i2c_start(unsigned char addr);
; addr = r24, return = r25(=0):r24
;*************************************************************************
.global i2c_start
.func i2c_start
i2c_start:
sbi SDA_DDR,SDA ;force SDA low
rcall i2c_delay_T2 ;delay T/2
rcall i2c_write ;write address
ret
.endfunc
;*************************************************************************
; Issues a repeated start condition and sends address and transfer direction.
; return 0 = device accessible, 1= failed to access device
;
; extern unsigned char i2c_rep_start(unsigned char addr);
; addr = r24, return = r25(=0):r24
;*************************************************************************
.global i2c_rep_start
.func i2c_rep_start
i2c_rep_start:
sbi SCL_DDR,SCL ;force SCL low
rcall i2c_delay_T2 ;delay T/2
cbi SDA_DDR,SDA ;release SDA
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
rcall i2c_delay_T2 ;delay T/2
sbi SDA_DDR,SDA ;force SDA low
rcall i2c_delay_T2 ;delay T/2
rcall i2c_write ;write address
ret
.endfunc
;*************************************************************************
; Issues a start condition and sends address and transfer direction.
; If device is busy, use ack polling to wait until device is ready
;
; extern void i2c_start_wait(unsigned char addr);
; addr = r24
;*************************************************************************
.global i2c_start_wait
.func i2c_start_wait
i2c_start_wait:
mov __tmp_reg__,r24
i2c_start_wait1:
sbi SDA_DDR,SDA ;force SDA low
rcall i2c_delay_T2 ;delay T/2
mov r24,__tmp_reg__
rcall i2c_write ;write address
tst r24 ;if device not busy -> done
breq i2c_start_wait_done
rcall i2c_stop ;terminate write operation
rjmp i2c_start_wait1 ;device busy, poll ack again
i2c_start_wait_done:
ret
.endfunc
;*************************************************************************
; Terminates the data transfer and releases the I2C bus
;
; extern void i2c_stop(void)
;*************************************************************************
.global i2c_stop
.func i2c_stop
i2c_stop:
sbi SCL_DDR,SCL ;force SCL low
sbi SDA_DDR,SDA ;force SDA low
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
rcall i2c_delay_T2 ;delay T/2
cbi SDA_DDR,SDA ;release SDA
rcall i2c_delay_T2 ;delay T/2
ret
.endfunc
;*************************************************************************
; Send one byte to I2C device
; return 0 = write successful, 1 = write failed
;
; extern unsigned char i2c_write( unsigned char data );
; data = r24, return = r25(=0):r24
;*************************************************************************
.global i2c_write
.func i2c_write
i2c_write:
sec ;set carry flag
rol r24 ;shift in carry and out bit one
rjmp i2c_write_first
i2c_write_bit:
lsl r24 ;if transmit register empty
i2c_write_first:
breq i2c_get_ack
sbi SCL_DDR,SCL ;force SCL low
brcc i2c_write_low
nop
cbi SDA_DDR,SDA ;release SDA
rjmp i2c_write_high
i2c_write_low:
sbi SDA_DDR,SDA ;force SDA low
rjmp i2c_write_high
i2c_write_high:
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
rcall i2c_delay_T2 ;delay T/2
rjmp i2c_write_bit
i2c_get_ack:
sbi SCL_DDR,SCL ;force SCL low
cbi SDA_DDR,SDA ;release SDA
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
i2c_ack_wait:
sbis SCL_IN,SCL ;wait SCL high (in case wait states are inserted)
rjmp i2c_ack_wait
clr r24 ;return 0
sbic SDA_IN,SDA ;if SDA high -> return 1
ldi r24,1
rcall i2c_delay_T2 ;delay T/2
clr r25
ret
.endfunc
;*************************************************************************
; read one byte from the I2C device, send ack or nak to device
; (ack=1, send ack, request more data from device
; ack=0, send nak, read is followed by a stop condition)
;
; extern unsigned char i2c_read(unsigned char ack);
; ack = r24, return = r25(=0):r24
; extern unsigned char i2c_readAck(void);
; extern unsigned char i2c_readNak(void);
; return = r25(=0):r24
;*************************************************************************
.global i2c_readAck
.global i2c_readNak
.global i2c_read
.func i2c_read
i2c_readNak:
clr r24
rjmp i2c_read
i2c_readAck:
ldi r24,0x01
i2c_read:
ldi r23,0x01 ;data = 0x01
i2c_read_bit:
sbi SCL_DDR,SCL ;force SCL low
cbi SDA_DDR,SDA ;release SDA (from previous ACK)
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
rcall i2c_delay_T2 ;delay T/2
i2c_read_stretch:
sbis SCL_IN, SCL ;loop until SCL is high (allow slave to stretch SCL)
rjmp i2c_read_stretch
clc ;clear carry flag
sbic SDA_IN,SDA ;if SDA is high
sec ; set carry flag
rol r23 ;store bit
brcc i2c_read_bit ;while receive register not full
i2c_put_ack:
sbi SCL_DDR,SCL ;force SCL low
cpi r24,1
breq i2c_put_ack_low ;if (ack=0)
cbi SDA_DDR,SDA ; release SDA
rjmp i2c_put_ack_high
i2c_put_ack_low: ;else
sbi SDA_DDR,SDA ; force SDA low
i2c_put_ack_high:
rcall i2c_delay_T2 ;delay T/2
cbi SCL_DDR,SCL ;release SCL
i2c_put_ack_wait:
sbis SCL_IN,SCL ;wait SCL high
rjmp i2c_put_ack_wait
rcall i2c_delay_T2 ;delay T/2
mov r24,r23
clr r25
ret
.endfunc

View File

@ -0,0 +1,178 @@
#ifndef _I2CMASTER_H
#define _I2CMASTER_H
/*************************************************************************
* Title: C include file for the I2C master interface
* (i2cmaster.S or twimaster.c)
* Author: Peter Fleury <pfleury@gmx.ch>
* File: $Id: i2cmaster.h,v 1.12 2015/09/16 09:27:58 peter Exp $
* Software: AVR-GCC 4.x
* Target: any AVR device
* Usage: see Doxygen manual
**************************************************************************/
/**
@file
@defgroup pfleury_ic2master I2C Master library
@code #include <i2cmaster.h> @endcode
@brief I2C (TWI) Master Software Library
Basic routines for communicating with I2C slave devices. This single master
implementation is limited to one bus master on the I2C bus.
This I2c library is implemented as a compact assembler software implementation of the I2C protocol
which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
Since the API for these two implementations is exactly the same, an application can be linked either against the
software I2C implementation or the hardware I2C implementation.
Use 4.7k pull-up resistor on the SDA and SCL pin.
Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
i2cmaster.S to your target when using the software I2C implementation !
Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
@note
The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
to GNU assembler and AVR-GCC C call interface.
Replaced the incorrect quarter period delays found in AVR300 with
half period delays.
@author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
@copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
@par API Usage Example
The following code shows typical usage of this library, see example test_i2cmaster.c
@code
#include <i2cmaster.h>
#define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet
int main(void)
{
unsigned char ret;
i2c_init(); // initialize I2C library
// write 0x75 to EEPROM address 5 (Byte Write)
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_write(0x75); // write value 0x75 to EEPROM
i2c_stop(); // set stop conditon = release bus
// read previously written value back from EEPROM address 5
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
}
@endcode
*/
/**@{*/
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
#include <avr/io.h>
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_READ 1
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_WRITE 0
/**
@brief initialize the I2C master interace. Need to be called only once
@return none
*/
extern "C" void i2c_init(void);
/**
@brief Terminates the data transfer and releases the I2C bus
@return none
*/
extern "C" void i2c_stop(void);
/**
@brief Issues a start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern "C" unsigned char i2c_start(unsigned char addr);
/**
@brief Issues a repeated start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern "C" unsigned char i2c_rep_start(unsigned char addr);
/**
@brief Issues a start condition and sends address and transfer direction
If device is busy, use ack polling to wait until device ready
@param addr address and transfer direction of I2C device
@return none
*/
extern "C" void i2c_start_wait(unsigned char addr);
/**
@brief Send one byte to I2C device
@param data byte to be transfered
@retval 0 write successful
@retval 1 write failed
*/
extern "C" unsigned char i2c_write(unsigned char data);
/**
@brief read one byte from the I2C device, request more data from device
@return byte read from I2C device
*/
extern "C" unsigned char i2c_readAck(void);
/**
@brief read one byte from the I2C device, read is followed by a stop condition
@return byte read from I2C device
*/
extern "C" unsigned char i2c_readNak(void);
/**
@brief read one byte from the I2C device
Implemented as a macro, which calls either @ref i2c_readAck or @ref i2c_readNak
@param ack 1 send ack, request more data from device<br>
0 send nak, read is followed by a stop condition
@return byte read from I2C device
*/
extern "C" unsigned char i2c_read(unsigned char ack);
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
/**@}*/
#endif

View File

@ -0,0 +1,5 @@
tinySPI KEYWORD1
begin KEYWORD2
setDataMode KEYWORD2
transfer KEYWORD2
end KEYWORD2

View File

@ -0,0 +1,53 @@
/*----------------------------------------------------------------------*
* tinySPI.h - Arduino hardware SPI master library for ATtiny44/84, *
* and ATtiny45/85. *
* *
* Jack Christensen 24Oct2013 *
* *
* CC BY-SA: *
* This work is licensed under the Creative Commons Attribution- *
* ShareAlike 3.0 Unported License. To view a copy of this license, *
* visit http://creativecommons.org/licenses/by-sa/3.0/ or send a *
* letter to Creative Commons, 171 Second Street, Suite 300, *
* San Francisco, California, 94105, USA. *
*----------------------------------------------------------------------*/
#include "tinySPI.h"
tinySPI::tinySPI()
{
}
void tinySPI::begin(void)
{
USICR &= ~(_BV(USISIE) | _BV(USIOIE) | _BV(USIWM1));
USICR |= _BV(USIWM0) | _BV(USICS1) | _BV(USICLK);
SPI_DDR_PORT |= _BV(USCK_DD_PIN); //set the USCK pin as output
SPI_DDR_PORT |= _BV(DO_DD_PIN); //set the DO pin as output
SPI_DDR_PORT &= ~_BV(DI_DD_PIN); //set the DI pin as input
}
void tinySPI::setDataMode(uint8_t spiDataMode)
{
if (spiDataMode == SPI_MODE1)
USICR |= _BV(USICS0);
else
USICR &= ~_BV(USICS0);
}
uint8_t tinySPI::transfer(uint8_t spiData)
{
USIDR = spiData;
USISR = _BV(USIOIF); //clear counter and counter overflow interrupt flag
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { //ensure a consistent clock period
while ( !(USISR & _BV(USIOIF)) ) USICR |= _BV(USITC);
}
return USIDR;
}
void tinySPI::end(void)
{
USICR &= ~(_BV(USIWM1) | _BV(USIWM0));
}
tinySPI SPI = tinySPI(); //instantiate a tinySPI object

View File

@ -0,0 +1,51 @@
/*----------------------------------------------------------------------*
* tinySPI.h - Arduino hardware SPI master library for ATtiny44/84, *
* and ATtiny45/85. *
* *
* Jack Christensen 24Oct2013 *
* *
* CC BY-SA: *
* This work is licensed under the Creative Commons Attribution- *
* ShareAlike 3.0 Unported License. To view a copy of this license, *
* visit http://creativecommons.org/licenses/by-sa/3.0/ or send a *
* letter to Creative Commons, 171 Second Street, Suite 300, *
* San Francisco, California, 94105, USA. *
*----------------------------------------------------------------------*/
#ifndef tinySPI_h
#define tinySPI_h
#include <stdint.h>
#include <avr/io.h>
#include <util/atomic.h>
//USI ports and pins
#if defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
#define SPI_DDR_PORT DDRA
#define USCK_DD_PIN DDA4
#define DO_DD_PIN DDA5
#define DI_DD_PIN DDA6
#elif defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
#define SPI_DDR_PORT DDRB
#define USCK_DD_PIN DDB2
#define DO_DD_PIN DDB1
#define DI_DD_PIN DDB0
#endif
//SPI data modes
#define SPI_MODE0 0x00
#define SPI_MODE1 0x04
class tinySPI
{
public:
tinySPI();
void begin(void);
void setDataMode(uint8_t spiDataMode);
uint8_t transfer(uint8_t spiData);
void end(void);
};
extern tinySPI SPI;
#endif

12
Firmware/platformio.ini Normal file
View File

@ -0,0 +1,12 @@
[env:attiny84]
platform = atmelavr
board = attiny84
platform = atmelavr
framework = arduino
upload_protocol = stk500v2
upload_flags =
-P/dev/ttyACM0
-b$UPLOAD_SPEED
upload_speed = 19200
monitor_speed = 9600
board_build.f_cpu = 1000000L

155
Firmware/src/main.cpp Normal file
View File

@ -0,0 +1,155 @@
/*
main.cpp - TinyLora BMP280 Firmware
Copyright (c) 2019, Stefan Brand
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <Arduino.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include "tinySPI.h"
#include "LoRaWAN.h"
#include <BME280.h>
//Change Keys in secconfig.h for your TTN application:
#include "secconfig.h"
// Initialize RFM95W and LoraWAN
#define DIO0 PIN_B0
#define NSS PIN_B1
RFM95 rfm(DIO0,NSS);
LoRaWAN lora = LoRaWAN(rfm);
unsigned int Frame_Counter_Tx = 0x0000;
// If set LED will blink when sending
#define LED_PIN PIN_A7
// Sensor Class
BME280 sensor;
// Global Variable used for deep sleep
unsigned int sleep_interval;
// Sleep Time (s) Between Two Measurements
#define SLEEP_TIME 528
// Setup Wakeup Interrupt Timer
void init_wdt()
{
MCUSR &= ~(1<<WDRF);
// Start timed sequence
// Set Watchdog Change Enable bit
WDTCSR |= (1<<WDCE) | (1<<WDE);
// Set new prescaler (1 sec), unset reset enable
// enable WDT interrupt
WDTCSR = (1<<WDIE)|(1<<WDP2)|(1<<WDP1);
}
// Enter Sleepmode, Sleep for s Seconds
void sleep(unsigned int s)
{
sleep_interval = 0;
while (sleep_interval < s) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
}
}
// Watchdog Callback for Sleep Timer
ISR(WATCHDOG_vect) {
sleep_interval++; // set global flag
// Start timed sequence
// Set Watchdog Change Enable bit
WDTCSR |= (1<<WDCE) | (1<<WDE);
// Set new prescaler (1 sec), unset reset enable
// enable WDT interrupt
WDTCSR = (1<<WDIE)|(1<<WDP2)|(1<<WDP1);
}
// Get Battery Voltage
long readVcc() {
bitClear(PRR, PRADC);
ADCSRA |= bit(ADEN); // Enable the ADC
long result;
ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1126400L / result; // Back-calculate Vcc in mV
ADCSRA &= ~ bit(ADEN);
bitSet(PRR, PRADC); // Disable the ADC to save power
return result;
}
void setup()
{
// Initialize Sleep Timer
init_wdt();
PRR = bit(PRTIM1);
// Setup LoraWAN
rfm.init();
lora.setKeys(NwkSkey, AppSkey, DevAddr);
// Setup LED if defined
#ifdef LED_PIN
pinMode(LED_PIN, OUTPUT);
#endif
delay(50);
}
void loop()
{
// Buffer to send data
int32_t data[4];
// Get Sensor Data
sensor.getData(&data[0], &data[1], &data[2]);
data[3] = readVcc();
// LED On before Sending
#ifdef LED_PIN
digitalWrite(LED_PIN, 1);
#endif
// Send LoRa Packet, Increment Frame Counter
lora.Send_Data((unsigned char *)data, sizeof(data), Frame_Counter_Tx);
Frame_Counter_Tx++;
// Led Off after Sending
#ifdef LED_PIN
digitalWrite(LED_PIN, 0);
#endif
// Sleep until next Measurement
sleep(SLEEP_TIME);
}

4
Firmware/src/secconfig.h Normal file
View File

@ -0,0 +1,4 @@
// Information from The Things Network, device configuration ACTIVATION METHOD: ABP, msb left
unsigned char NwkSkey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned char AppSkey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned char DevAddr[4] = { 0x00, 0x00, 0x00, 0x00 };

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,655 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.4*
G04 #@! TF.CreationDate,2019-09-05T17:57:58+02:00*
G04 #@! TF.ProjectId,LORA_ATTINY84,4c4f5241-5f41-4545-9449-4e5938342e6b,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Bot*
G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.4) date 2019-09-05 17:57:58*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
%ADD10C,0.100000*%
G04 APERTURE END LIST*
D10*
G36*
X90436000Y-73926000D02*
G01*
X88634000Y-73926000D01*
X88634000Y-72124000D01*
X90436000Y-72124000D01*
X90436000Y-73926000D01*
X90436000Y-73926000D01*
G37*
G36*
X89645442Y-65145518D02*
G01*
X89711627Y-65152037D01*
X89881466Y-65203557D01*
X90037991Y-65287222D01*
X90073729Y-65316552D01*
X90175186Y-65399814D01*
X90258448Y-65501271D01*
X90287778Y-65537009D01*
X90371443Y-65693534D01*
X90422963Y-65863373D01*
X90440359Y-66040000D01*
X90422963Y-66216627D01*
X90371443Y-66386466D01*
X90287778Y-66542991D01*
X90258448Y-66578729D01*
X90175186Y-66680186D01*
X90073729Y-66763448D01*
X90037991Y-66792778D01*
X89881466Y-66876443D01*
X89711627Y-66927963D01*
X89645442Y-66934482D01*
X89579260Y-66941000D01*
X89490740Y-66941000D01*
X89424558Y-66934482D01*
X89358373Y-66927963D01*
X89188534Y-66876443D01*
X89032009Y-66792778D01*
X88996271Y-66763448D01*
X88894814Y-66680186D01*
X88811552Y-66578729D01*
X88782222Y-66542991D01*
X88698557Y-66386466D01*
X88647037Y-66216627D01*
X88629641Y-66040000D01*
X88647037Y-65863373D01*
X88698557Y-65693534D01*
X88782222Y-65537009D01*
X88811552Y-65501271D01*
X88894814Y-65399814D01*
X88996271Y-65316552D01*
X89032009Y-65287222D01*
X89188534Y-65203557D01*
X89358373Y-65152037D01*
X89424558Y-65145518D01*
X89490740Y-65139000D01*
X89579260Y-65139000D01*
X89645442Y-65145518D01*
X89645442Y-65145518D01*
G37*
G36*
X89645442Y-62605518D02*
G01*
X89711627Y-62612037D01*
X89881466Y-62663557D01*
X90037991Y-62747222D01*
X90073729Y-62776552D01*
X90175186Y-62859814D01*
X90258448Y-62961271D01*
X90287778Y-62997009D01*
X90371443Y-63153534D01*
X90422963Y-63323373D01*
X90440359Y-63500000D01*
X90422963Y-63676627D01*
X90371443Y-63846466D01*
X90287778Y-64002991D01*
X90258448Y-64038729D01*
X90175186Y-64140186D01*
X90073729Y-64223448D01*
X90037991Y-64252778D01*
X89881466Y-64336443D01*
X89711627Y-64387963D01*
X89645442Y-64394482D01*
X89579260Y-64401000D01*
X89490740Y-64401000D01*
X89424558Y-64394482D01*
X89358373Y-64387963D01*
X89188534Y-64336443D01*
X89032009Y-64252778D01*
X88996271Y-64223448D01*
X88894814Y-64140186D01*
X88811552Y-64038729D01*
X88782222Y-64002991D01*
X88698557Y-63846466D01*
X88647037Y-63676627D01*
X88629641Y-63500000D01*
X88647037Y-63323373D01*
X88698557Y-63153534D01*
X88782222Y-62997009D01*
X88811552Y-62961271D01*
X88894814Y-62859814D01*
X88996271Y-62776552D01*
X89032009Y-62747222D01*
X89188534Y-62663557D01*
X89358373Y-62612037D01*
X89424558Y-62605518D01*
X89490740Y-62599000D01*
X89579260Y-62599000D01*
X89645442Y-62605518D01*
X89645442Y-62605518D01*
G37*
G36*
X89645442Y-60065518D02*
G01*
X89711627Y-60072037D01*
X89881466Y-60123557D01*
X90037991Y-60207222D01*
X90073729Y-60236552D01*
X90175186Y-60319814D01*
X90258448Y-60421271D01*
X90287778Y-60457009D01*
X90371443Y-60613534D01*
X90422963Y-60783373D01*
X90440359Y-60960000D01*
X90422963Y-61136627D01*
X90371443Y-61306466D01*
X90287778Y-61462991D01*
X90258448Y-61498729D01*
X90175186Y-61600186D01*
X90073729Y-61683448D01*
X90037991Y-61712778D01*
X89881466Y-61796443D01*
X89711627Y-61847963D01*
X89645443Y-61854481D01*
X89579260Y-61861000D01*
X89490740Y-61861000D01*
X89424557Y-61854481D01*
X89358373Y-61847963D01*
X89188534Y-61796443D01*
X89032009Y-61712778D01*
X88996271Y-61683448D01*
X88894814Y-61600186D01*
X88811552Y-61498729D01*
X88782222Y-61462991D01*
X88698557Y-61306466D01*
X88647037Y-61136627D01*
X88629641Y-60960000D01*
X88647037Y-60783373D01*
X88698557Y-60613534D01*
X88782222Y-60457009D01*
X88811552Y-60421271D01*
X88894814Y-60319814D01*
X88996271Y-60236552D01*
X89032009Y-60207222D01*
X89188534Y-60123557D01*
X89358373Y-60072037D01*
X89424558Y-60065518D01*
X89490740Y-60059000D01*
X89579260Y-60059000D01*
X89645442Y-60065518D01*
X89645442Y-60065518D01*
G37*
G36*
X89645443Y-57525519D02*
G01*
X89711627Y-57532037D01*
X89881466Y-57583557D01*
X90037991Y-57667222D01*
X90073729Y-57696552D01*
X90175186Y-57779814D01*
X90258448Y-57881271D01*
X90287778Y-57917009D01*
X90371443Y-58073534D01*
X90422963Y-58243373D01*
X90440359Y-58420000D01*
X90422963Y-58596627D01*
X90371443Y-58766466D01*
X90287778Y-58922991D01*
X90258448Y-58958729D01*
X90175186Y-59060186D01*
X90073729Y-59143448D01*
X90037991Y-59172778D01*
X89881466Y-59256443D01*
X89711627Y-59307963D01*
X89645442Y-59314482D01*
X89579260Y-59321000D01*
X89490740Y-59321000D01*
X89424558Y-59314482D01*
X89358373Y-59307963D01*
X89188534Y-59256443D01*
X89032009Y-59172778D01*
X88996271Y-59143448D01*
X88894814Y-59060186D01*
X88811552Y-58958729D01*
X88782222Y-58922991D01*
X88698557Y-58766466D01*
X88647037Y-58596627D01*
X88629641Y-58420000D01*
X88647037Y-58243373D01*
X88698557Y-58073534D01*
X88782222Y-57917009D01*
X88811552Y-57881271D01*
X88894814Y-57779814D01*
X88996271Y-57696552D01*
X89032009Y-57667222D01*
X89188534Y-57583557D01*
X89358373Y-57532037D01*
X89424557Y-57525519D01*
X89490740Y-57519000D01*
X89579260Y-57519000D01*
X89645443Y-57525519D01*
X89645443Y-57525519D01*
G37*
G36*
X89645443Y-54985519D02*
G01*
X89711627Y-54992037D01*
X89881466Y-55043557D01*
X90037991Y-55127222D01*
X90073729Y-55156552D01*
X90175186Y-55239814D01*
X90258448Y-55341271D01*
X90287778Y-55377009D01*
X90371443Y-55533534D01*
X90422963Y-55703373D01*
X90440359Y-55880000D01*
X90422963Y-56056627D01*
X90371443Y-56226466D01*
X90287778Y-56382991D01*
X90258448Y-56418729D01*
X90175186Y-56520186D01*
X90073729Y-56603448D01*
X90037991Y-56632778D01*
X89881466Y-56716443D01*
X89711627Y-56767963D01*
X89645443Y-56774481D01*
X89579260Y-56781000D01*
X89490740Y-56781000D01*
X89424557Y-56774481D01*
X89358373Y-56767963D01*
X89188534Y-56716443D01*
X89032009Y-56632778D01*
X88996271Y-56603448D01*
X88894814Y-56520186D01*
X88811552Y-56418729D01*
X88782222Y-56382991D01*
X88698557Y-56226466D01*
X88647037Y-56056627D01*
X88629641Y-55880000D01*
X88647037Y-55703373D01*
X88698557Y-55533534D01*
X88782222Y-55377009D01*
X88811552Y-55341271D01*
X88894814Y-55239814D01*
X88996271Y-55156552D01*
X89032009Y-55127222D01*
X89188534Y-55043557D01*
X89358373Y-54992037D01*
X89424557Y-54985519D01*
X89490740Y-54979000D01*
X89579260Y-54979000D01*
X89645443Y-54985519D01*
X89645443Y-54985519D01*
G37*
G36*
X89645443Y-52445519D02*
G01*
X89711627Y-52452037D01*
X89881466Y-52503557D01*
X90037991Y-52587222D01*
X90073729Y-52616552D01*
X90175186Y-52699814D01*
X90258448Y-52801271D01*
X90287778Y-52837009D01*
X90371443Y-52993534D01*
X90422963Y-53163373D01*
X90440359Y-53340000D01*
X90422963Y-53516627D01*
X90371443Y-53686466D01*
X90287778Y-53842991D01*
X90258448Y-53878729D01*
X90175186Y-53980186D01*
X90073729Y-54063448D01*
X90037991Y-54092778D01*
X89881466Y-54176443D01*
X89711627Y-54227963D01*
X89645442Y-54234482D01*
X89579260Y-54241000D01*
X89490740Y-54241000D01*
X89424558Y-54234482D01*
X89358373Y-54227963D01*
X89188534Y-54176443D01*
X89032009Y-54092778D01*
X88996271Y-54063448D01*
X88894814Y-53980186D01*
X88811552Y-53878729D01*
X88782222Y-53842991D01*
X88698557Y-53686466D01*
X88647037Y-53516627D01*
X88629641Y-53340000D01*
X88647037Y-53163373D01*
X88698557Y-52993534D01*
X88782222Y-52837009D01*
X88811552Y-52801271D01*
X88894814Y-52699814D01*
X88996271Y-52616552D01*
X89032009Y-52587222D01*
X89188534Y-52503557D01*
X89358373Y-52452037D01*
X89424558Y-52445518D01*
X89490740Y-52439000D01*
X89579260Y-52439000D01*
X89645443Y-52445519D01*
X89645443Y-52445519D01*
G37*
G36*
X71992443Y-52445519D02*
G01*
X72058627Y-52452037D01*
X72228466Y-52503557D01*
X72384991Y-52587222D01*
X72420729Y-52616552D01*
X72522186Y-52699814D01*
X72605448Y-52801271D01*
X72634778Y-52837009D01*
X72718443Y-52993534D01*
X72769963Y-53163373D01*
X72787359Y-53340000D01*
X72769963Y-53516627D01*
X72718443Y-53686466D01*
X72634778Y-53842991D01*
X72605448Y-53878729D01*
X72522186Y-53980186D01*
X72420729Y-54063448D01*
X72384991Y-54092778D01*
X72228466Y-54176443D01*
X72058627Y-54227963D01*
X71992442Y-54234482D01*
X71926260Y-54241000D01*
X71837740Y-54241000D01*
X71771558Y-54234482D01*
X71705373Y-54227963D01*
X71535534Y-54176443D01*
X71379009Y-54092778D01*
X71343271Y-54063448D01*
X71241814Y-53980186D01*
X71158552Y-53878729D01*
X71129222Y-53842991D01*
X71045557Y-53686466D01*
X70994037Y-53516627D01*
X70976641Y-53340000D01*
X70994037Y-53163373D01*
X71045557Y-52993534D01*
X71129222Y-52837009D01*
X71158552Y-52801271D01*
X71241814Y-52699814D01*
X71343271Y-52616552D01*
X71379009Y-52587222D01*
X71535534Y-52503557D01*
X71705373Y-52452037D01*
X71771558Y-52445518D01*
X71837740Y-52439000D01*
X71926260Y-52439000D01*
X71992443Y-52445519D01*
X71992443Y-52445519D01*
G37*
G36*
X69452443Y-52445519D02*
G01*
X69518627Y-52452037D01*
X69688466Y-52503557D01*
X69844991Y-52587222D01*
X69880729Y-52616552D01*
X69982186Y-52699814D01*
X70065448Y-52801271D01*
X70094778Y-52837009D01*
X70178443Y-52993534D01*
X70229963Y-53163373D01*
X70247359Y-53340000D01*
X70229963Y-53516627D01*
X70178443Y-53686466D01*
X70094778Y-53842991D01*
X70065448Y-53878729D01*
X69982186Y-53980186D01*
X69880729Y-54063448D01*
X69844991Y-54092778D01*
X69688466Y-54176443D01*
X69518627Y-54227963D01*
X69452442Y-54234482D01*
X69386260Y-54241000D01*
X69297740Y-54241000D01*
X69231558Y-54234482D01*
X69165373Y-54227963D01*
X68995534Y-54176443D01*
X68839009Y-54092778D01*
X68803271Y-54063448D01*
X68701814Y-53980186D01*
X68618552Y-53878729D01*
X68589222Y-53842991D01*
X68505557Y-53686466D01*
X68454037Y-53516627D01*
X68436641Y-53340000D01*
X68454037Y-53163373D01*
X68505557Y-52993534D01*
X68589222Y-52837009D01*
X68618552Y-52801271D01*
X68701814Y-52699814D01*
X68803271Y-52616552D01*
X68839009Y-52587222D01*
X68995534Y-52503557D01*
X69165373Y-52452037D01*
X69231558Y-52445518D01*
X69297740Y-52439000D01*
X69386260Y-52439000D01*
X69452443Y-52445519D01*
X69452443Y-52445519D01*
G37*
G36*
X69452442Y-49905518D02*
G01*
X69518627Y-49912037D01*
X69688466Y-49963557D01*
X69844991Y-50047222D01*
X69880729Y-50076552D01*
X69982186Y-50159814D01*
X70065448Y-50261271D01*
X70094778Y-50297009D01*
X70178443Y-50453534D01*
X70229963Y-50623373D01*
X70247359Y-50800000D01*
X70229963Y-50976627D01*
X70178443Y-51146466D01*
X70094778Y-51302991D01*
X70065448Y-51338729D01*
X69982186Y-51440186D01*
X69880729Y-51523448D01*
X69844991Y-51552778D01*
X69688466Y-51636443D01*
X69518627Y-51687963D01*
X69452442Y-51694482D01*
X69386260Y-51701000D01*
X69297740Y-51701000D01*
X69231558Y-51694482D01*
X69165373Y-51687963D01*
X68995534Y-51636443D01*
X68839009Y-51552778D01*
X68803271Y-51523448D01*
X68701814Y-51440186D01*
X68618552Y-51338729D01*
X68589222Y-51302991D01*
X68505557Y-51146466D01*
X68454037Y-50976627D01*
X68436641Y-50800000D01*
X68454037Y-50623373D01*
X68505557Y-50453534D01*
X68589222Y-50297009D01*
X68618552Y-50261271D01*
X68701814Y-50159814D01*
X68803271Y-50076552D01*
X68839009Y-50047222D01*
X68995534Y-49963557D01*
X69165373Y-49912037D01*
X69231557Y-49905519D01*
X69297740Y-49899000D01*
X69386260Y-49899000D01*
X69452442Y-49905518D01*
X69452442Y-49905518D01*
G37*
G36*
X89645442Y-49905518D02*
G01*
X89711627Y-49912037D01*
X89881466Y-49963557D01*
X90037991Y-50047222D01*
X90073729Y-50076552D01*
X90175186Y-50159814D01*
X90258448Y-50261271D01*
X90287778Y-50297009D01*
X90371443Y-50453534D01*
X90422963Y-50623373D01*
X90440359Y-50800000D01*
X90422963Y-50976627D01*
X90371443Y-51146466D01*
X90287778Y-51302991D01*
X90258448Y-51338729D01*
X90175186Y-51440186D01*
X90073729Y-51523448D01*
X90037991Y-51552778D01*
X89881466Y-51636443D01*
X89711627Y-51687963D01*
X89645442Y-51694482D01*
X89579260Y-51701000D01*
X89490740Y-51701000D01*
X89424558Y-51694482D01*
X89358373Y-51687963D01*
X89188534Y-51636443D01*
X89032009Y-51552778D01*
X88996271Y-51523448D01*
X88894814Y-51440186D01*
X88811552Y-51338729D01*
X88782222Y-51302991D01*
X88698557Y-51146466D01*
X88647037Y-50976627D01*
X88629641Y-50800000D01*
X88647037Y-50623373D01*
X88698557Y-50453534D01*
X88782222Y-50297009D01*
X88811552Y-50261271D01*
X88894814Y-50159814D01*
X88996271Y-50076552D01*
X89032009Y-50047222D01*
X89188534Y-49963557D01*
X89358373Y-49912037D01*
X89424557Y-49905519D01*
X89490740Y-49899000D01*
X89579260Y-49899000D01*
X89645442Y-49905518D01*
X89645442Y-49905518D01*
G37*
G36*
X71992442Y-49905518D02*
G01*
X72058627Y-49912037D01*
X72228466Y-49963557D01*
X72384991Y-50047222D01*
X72420729Y-50076552D01*
X72522186Y-50159814D01*
X72605448Y-50261271D01*
X72634778Y-50297009D01*
X72718443Y-50453534D01*
X72769963Y-50623373D01*
X72787359Y-50800000D01*
X72769963Y-50976627D01*
X72718443Y-51146466D01*
X72634778Y-51302991D01*
X72605448Y-51338729D01*
X72522186Y-51440186D01*
X72420729Y-51523448D01*
X72384991Y-51552778D01*
X72228466Y-51636443D01*
X72058627Y-51687963D01*
X71992442Y-51694482D01*
X71926260Y-51701000D01*
X71837740Y-51701000D01*
X71771558Y-51694482D01*
X71705373Y-51687963D01*
X71535534Y-51636443D01*
X71379009Y-51552778D01*
X71343271Y-51523448D01*
X71241814Y-51440186D01*
X71158552Y-51338729D01*
X71129222Y-51302991D01*
X71045557Y-51146466D01*
X70994037Y-50976627D01*
X70976641Y-50800000D01*
X70994037Y-50623373D01*
X71045557Y-50453534D01*
X71129222Y-50297009D01*
X71158552Y-50261271D01*
X71241814Y-50159814D01*
X71343271Y-50076552D01*
X71379009Y-50047222D01*
X71535534Y-49963557D01*
X71705373Y-49912037D01*
X71771557Y-49905519D01*
X71837740Y-49899000D01*
X71926260Y-49899000D01*
X71992442Y-49905518D01*
X71992442Y-49905518D01*
G37*
G36*
X90436000Y-49161000D02*
G01*
X88634000Y-49161000D01*
X88634000Y-47359000D01*
X90436000Y-47359000D01*
X90436000Y-49161000D01*
X90436000Y-49161000D01*
G37*
G36*
X70243000Y-49161000D02*
G01*
X68441000Y-49161000D01*
X68441000Y-47359000D01*
X70243000Y-47359000D01*
X70243000Y-49161000D01*
X70243000Y-49161000D01*
G37*
G36*
X71992443Y-47365519D02*
G01*
X72058627Y-47372037D01*
X72228466Y-47423557D01*
X72384991Y-47507222D01*
X72420729Y-47536552D01*
X72522186Y-47619814D01*
X72605448Y-47721271D01*
X72634778Y-47757009D01*
X72718443Y-47913534D01*
X72769963Y-48083373D01*
X72787359Y-48260000D01*
X72769963Y-48436627D01*
X72718443Y-48606466D01*
X72634778Y-48762991D01*
X72605448Y-48798729D01*
X72522186Y-48900186D01*
X72420729Y-48983448D01*
X72384991Y-49012778D01*
X72228466Y-49096443D01*
X72058627Y-49147963D01*
X71992443Y-49154481D01*
X71926260Y-49161000D01*
X71837740Y-49161000D01*
X71771557Y-49154481D01*
X71705373Y-49147963D01*
X71535534Y-49096443D01*
X71379009Y-49012778D01*
X71343271Y-48983448D01*
X71241814Y-48900186D01*
X71158552Y-48798729D01*
X71129222Y-48762991D01*
X71045557Y-48606466D01*
X70994037Y-48436627D01*
X70976641Y-48260000D01*
X70994037Y-48083373D01*
X71045557Y-47913534D01*
X71129222Y-47757009D01*
X71158552Y-47721271D01*
X71241814Y-47619814D01*
X71343271Y-47536552D01*
X71379009Y-47507222D01*
X71535534Y-47423557D01*
X71705373Y-47372037D01*
X71771557Y-47365519D01*
X71837740Y-47359000D01*
X71926260Y-47359000D01*
X71992443Y-47365519D01*
X71992443Y-47365519D01*
G37*
M02*

View File

@ -0,0 +1,14 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.4*
G04 #@! TF.CreationDate,2019-09-05T17:57:58+02:00*
G04 #@! TF.ProjectId,LORA_ATTINY84,4c4f5241-5f41-4545-9449-4e5938342e6b,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.4) date 2019-09-05 17:57:58*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@ -0,0 +1,14 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.4*
G04 #@! TF.CreationDate,2019-09-05T17:57:58+02:00*
G04 #@! TF.ProjectId,LORA_ATTINY84,4c4f5241-5f41-4545-9449-4e5938342e6b,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.4) date 2019-09-05 17:57:58*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@ -0,0 +1,23 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.4*
G04 #@! TF.CreationDate,2019-09-05T17:57:58+02:00*
G04 #@! TF.ProjectId,LORA_ATTINY84,4c4f5241-5f41-4545-9449-4e5938342e6b,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.4) date 2019-09-05 17:57:58*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
%ADD10C,0.050000*%
G04 APERTURE END LIST*
D10*
X92710000Y-43180000D02*
X45720000Y-43180000D01*
X92710000Y-78740000D02*
X92710000Y-43180000D01*
X45720000Y-78740000D02*
X92710000Y-78740000D01*
X45720000Y-43180000D02*
X45720000Y-78740000D01*
M02*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,599 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.4*
G04 #@! TF.CreationDate,2019-09-05T17:57:58+02:00*
G04 #@! TF.ProjectId,LORA_ATTINY84,4c4f5241-5f41-4545-9449-4e5938342e6b,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Top*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.4) date 2019-09-05 17:57:58*
%MOMM*%
%LPD*%
G04 APERTURE LIST*
%ADD10C,0.150000*%
%ADD11C,0.120000*%
%ADD12C,0.200000*%
G04 APERTURE END LIST*
D10*
X46467780Y-65834590D02*
X46467780Y-65263161D01*
X47467780Y-65548876D02*
X46467780Y-65548876D01*
X47467780Y-64929828D02*
X46801114Y-64929828D01*
X46467780Y-64929828D02*
X46515400Y-64977447D01*
X46563019Y-64929828D01*
X46515400Y-64882209D01*
X46467780Y-64929828D01*
X46563019Y-64929828D01*
X46801114Y-64453638D02*
X47467780Y-64453638D01*
X46896352Y-64453638D02*
X46848733Y-64406019D01*
X46801114Y-64310780D01*
X46801114Y-64167923D01*
X46848733Y-64072685D01*
X46943971Y-64025066D01*
X47467780Y-64025066D01*
X46801114Y-63644114D02*
X47467780Y-63406019D01*
X46801114Y-63167923D02*
X47467780Y-63406019D01*
X47705876Y-63501257D01*
X47753495Y-63548876D01*
X47801114Y-63644114D01*
X47467780Y-62310780D02*
X47467780Y-62786971D01*
X46467780Y-62786971D01*
X47467780Y-61834590D02*
X47420161Y-61929828D01*
X47372542Y-61977447D01*
X47277304Y-62025066D01*
X46991590Y-62025066D01*
X46896352Y-61977447D01*
X46848733Y-61929828D01*
X46801114Y-61834590D01*
X46801114Y-61691733D01*
X46848733Y-61596495D01*
X46896352Y-61548876D01*
X46991590Y-61501257D01*
X47277304Y-61501257D01*
X47372542Y-61548876D01*
X47420161Y-61596495D01*
X47467780Y-61691733D01*
X47467780Y-61834590D01*
X47467780Y-61072685D02*
X46801114Y-61072685D01*
X46991590Y-61072685D02*
X46896352Y-61025066D01*
X46848733Y-60977447D01*
X46801114Y-60882209D01*
X46801114Y-60786971D01*
X47467780Y-60025066D02*
X46943971Y-60025066D01*
X46848733Y-60072685D01*
X46801114Y-60167923D01*
X46801114Y-60358399D01*
X46848733Y-60453638D01*
X47420161Y-60025066D02*
X47467780Y-60120304D01*
X47467780Y-60358399D01*
X47420161Y-60453638D01*
X47324923Y-60501257D01*
X47229685Y-60501257D01*
X47134447Y-60453638D01*
X47086828Y-60358399D01*
X47086828Y-60120304D01*
X47039209Y-60025066D01*
X46467780Y-58929828D02*
X47467780Y-58596495D01*
X46467780Y-58263161D01*
X47467780Y-57406019D02*
X47467780Y-57977447D01*
X47467780Y-57691733D02*
X46467780Y-57691733D01*
X46610638Y-57786971D01*
X46705876Y-57882209D01*
X46753495Y-57977447D01*
X47372542Y-56977447D02*
X47420161Y-56929828D01*
X47467780Y-56977447D01*
X47420161Y-57025066D01*
X47372542Y-56977447D01*
X47467780Y-56977447D01*
X47467780Y-55977447D02*
X47467780Y-56548876D01*
X47467780Y-56263161D02*
X46467780Y-56263161D01*
X46610638Y-56358400D01*
X46705876Y-56453638D01*
X46753495Y-56548876D01*
D11*
X82201936Y-77237000D02*
X83406064Y-77237000D01*
X82201936Y-75417000D02*
X83406064Y-75417000D01*
X85132500Y-49562936D02*
X85132500Y-50767064D01*
X86952500Y-49562936D02*
X86952500Y-50767064D01*
X68012000Y-46930000D02*
X69342000Y-46930000D01*
X68012000Y-48260000D02*
X68012000Y-46930000D01*
X70612000Y-46930000D02*
X73212000Y-46930000D01*
X70612000Y-49530000D02*
X70612000Y-46930000D01*
X68012000Y-49530000D02*
X70612000Y-49530000D01*
X73212000Y-46930000D02*
X73212000Y-54670000D01*
X68012000Y-49530000D02*
X68012000Y-54670000D01*
X68012000Y-54670000D02*
X73212000Y-54670000D01*
X88205000Y-46930000D02*
X89535000Y-46930000D01*
X88205000Y-48260000D02*
X88205000Y-46930000D01*
X88205000Y-49530000D02*
X90865000Y-49530000D01*
X90865000Y-49530000D02*
X90865000Y-67370000D01*
X88205000Y-49530000D02*
X88205000Y-67370000D01*
X88205000Y-67370000D02*
X90865000Y-67370000D01*
X75724936Y-77237000D02*
X76929064Y-77237000D01*
X75724936Y-75417000D02*
X76929064Y-75417000D01*
X67517000Y-77462000D02*
X71577000Y-77462000D01*
X67517000Y-75192000D02*
X67517000Y-77462000D01*
X71577000Y-75192000D02*
X67517000Y-75192000D01*
X60365000Y-49610000D02*
X60365000Y-46410000D01*
X60365000Y-46410000D02*
X58815000Y-46410000D01*
X64865000Y-49610000D02*
X60365000Y-49610000D01*
X64865000Y-49610000D02*
X64865000Y-70510000D01*
X63065000Y-72310000D02*
X60365000Y-72310000D01*
X64865000Y-70510000D02*
X63065000Y-72310000D01*
X60365000Y-72310000D02*
X60365000Y-75510000D01*
X60365000Y-75510000D02*
X58815000Y-75510000D01*
X52665000Y-72310000D02*
X52665000Y-75510000D01*
X52665000Y-75510000D02*
X54215000Y-75510000D01*
X52665000Y-49610000D02*
X52665000Y-46410000D01*
X52665000Y-46410000D02*
X54215000Y-46410000D01*
X48165000Y-72310000D02*
X48165000Y-49610000D01*
X48165000Y-72310000D02*
X52665000Y-72310000D01*
X48165000Y-49610000D02*
X52665000Y-49610000D01*
X61515000Y-73960000D02*
X63515000Y-73960000D01*
X62515000Y-72960000D02*
X62515000Y-74960000D01*
X84445000Y-50165000D02*
X84445000Y-46715000D01*
X84445000Y-50165000D02*
X84445000Y-52115000D01*
X75575000Y-50165000D02*
X75575000Y-48215000D01*
X75575000Y-50165000D02*
X75575000Y-52115000D01*
D12*
X68580000Y-57420000D02*
X84580000Y-57420000D01*
X68580000Y-69220000D02*
X68580000Y-69620000D01*
X68580000Y-67220000D02*
X68580000Y-67620000D01*
X68580000Y-65220000D02*
X68580000Y-65620000D01*
X68580000Y-63220000D02*
X68580000Y-63620000D01*
X68580000Y-61620000D02*
X68580000Y-61220000D01*
X68580000Y-59620000D02*
X68580000Y-59220000D01*
X67580000Y-57620000D02*
X68580000Y-57620000D01*
X68580000Y-57620000D02*
X68580000Y-57420000D01*
X68580000Y-71220000D02*
X68580000Y-71620000D01*
X84580000Y-57420000D02*
X84580000Y-57620000D01*
X84580000Y-59220000D02*
X84580000Y-59620000D01*
X84580000Y-61220000D02*
X84580000Y-61620000D01*
X84580000Y-63220000D02*
X84580000Y-63620000D01*
X84580000Y-65220000D02*
X84580000Y-65620000D01*
X84580000Y-67220000D02*
X84580000Y-67620000D01*
X84580000Y-69220000D02*
X84580000Y-69620000D01*
X84580000Y-71220000D02*
X84580000Y-71620000D01*
X84580000Y-73220000D02*
X84580000Y-73420000D01*
X84580000Y-73420000D02*
X68580000Y-73420000D01*
X68580000Y-73420000D02*
X68580000Y-73220000D01*
D11*
X90865000Y-74355000D02*
X89535000Y-74355000D01*
X90865000Y-73025000D02*
X90865000Y-74355000D01*
X90865000Y-71755000D02*
X88205000Y-71755000D01*
X88205000Y-71755000D02*
X88205000Y-71695000D01*
X90865000Y-71755000D02*
X90865000Y-71695000D01*
X90865000Y-71695000D02*
X88205000Y-71695000D01*
D10*
X82637333Y-74864142D02*
X82589714Y-74911761D01*
X82446857Y-74959380D01*
X82351619Y-74959380D01*
X82208761Y-74911761D01*
X82113523Y-74816523D01*
X82065904Y-74721285D01*
X82018285Y-74530809D01*
X82018285Y-74387952D01*
X82065904Y-74197476D01*
X82113523Y-74102238D01*
X82208761Y-74007000D01*
X82351619Y-73959380D01*
X82446857Y-73959380D01*
X82589714Y-74007000D01*
X82637333Y-74054619D01*
X83018285Y-74054619D02*
X83065904Y-74007000D01*
X83161142Y-73959380D01*
X83399238Y-73959380D01*
X83494476Y-74007000D01*
X83542095Y-74054619D01*
X83589714Y-74149857D01*
X83589714Y-74245095D01*
X83542095Y-74387952D01*
X82970666Y-74959380D01*
X83589714Y-74959380D01*
X85875833Y-47156642D02*
X85828214Y-47204261D01*
X85685357Y-47251880D01*
X85590119Y-47251880D01*
X85447261Y-47204261D01*
X85352023Y-47109023D01*
X85304404Y-47013785D01*
X85256785Y-46823309D01*
X85256785Y-46680452D01*
X85304404Y-46489976D01*
X85352023Y-46394738D01*
X85447261Y-46299500D01*
X85590119Y-46251880D01*
X85685357Y-46251880D01*
X85828214Y-46299500D01*
X85875833Y-46347119D01*
X86828214Y-47251880D02*
X86256785Y-47251880D01*
X86542500Y-47251880D02*
X86542500Y-46251880D01*
X86447261Y-46394738D01*
X86352023Y-46489976D01*
X86256785Y-46537595D01*
X68873904Y-46382380D02*
X68873904Y-45382380D01*
X69254857Y-45382380D01*
X69350095Y-45430000D01*
X69397714Y-45477619D01*
X69445333Y-45572857D01*
X69445333Y-45715714D01*
X69397714Y-45810952D01*
X69350095Y-45858571D01*
X69254857Y-45906190D01*
X68873904Y-45906190D01*
X70445333Y-46382380D02*
X70112000Y-45906190D01*
X69873904Y-46382380D02*
X69873904Y-45382380D01*
X70254857Y-45382380D01*
X70350095Y-45430000D01*
X70397714Y-45477619D01*
X70445333Y-45572857D01*
X70445333Y-45715714D01*
X70397714Y-45810952D01*
X70350095Y-45858571D01*
X70254857Y-45906190D01*
X69873904Y-45906190D01*
X71397714Y-45430000D02*
X71302476Y-45382380D01*
X71159619Y-45382380D01*
X71016761Y-45430000D01*
X70921523Y-45525238D01*
X70873904Y-45620476D01*
X70826285Y-45810952D01*
X70826285Y-45953809D01*
X70873904Y-46144285D01*
X70921523Y-46239523D01*
X71016761Y-46334761D01*
X71159619Y-46382380D01*
X71254857Y-46382380D01*
X71397714Y-46334761D01*
X71445333Y-46287142D01*
X71445333Y-45953809D01*
X71254857Y-45953809D01*
X72397714Y-46382380D02*
X71826285Y-46382380D01*
X72112000Y-46382380D02*
X72112000Y-45382380D01*
X72016761Y-45525238D01*
X71921523Y-45620476D01*
X71826285Y-45668095D01*
X89201666Y-45382380D02*
X89201666Y-46096666D01*
X89154047Y-46239523D01*
X89058809Y-46334761D01*
X88915952Y-46382380D01*
X88820714Y-46382380D01*
X90201666Y-46382380D02*
X89630238Y-46382380D01*
X89915952Y-46382380D02*
X89915952Y-45382380D01*
X89820714Y-45525238D01*
X89725476Y-45620476D01*
X89630238Y-45668095D01*
X76160333Y-74959380D02*
X75827000Y-74483190D01*
X75588904Y-74959380D02*
X75588904Y-73959380D01*
X75969857Y-73959380D01*
X76065095Y-74007000D01*
X76112714Y-74054619D01*
X76160333Y-74149857D01*
X76160333Y-74292714D01*
X76112714Y-74387952D01*
X76065095Y-74435571D01*
X75969857Y-74483190D01*
X75588904Y-74483190D01*
X77112714Y-74959380D02*
X76541285Y-74959380D01*
X76827000Y-74959380D02*
X76827000Y-73959380D01*
X76731761Y-74102238D01*
X76636523Y-74197476D01*
X76541285Y-74245095D01*
X69238904Y-74959380D02*
X69238904Y-73959380D01*
X69477000Y-73959380D01*
X69619857Y-74007000D01*
X69715095Y-74102238D01*
X69762714Y-74197476D01*
X69810333Y-74387952D01*
X69810333Y-74530809D01*
X69762714Y-74721285D01*
X69715095Y-74816523D01*
X69619857Y-74911761D01*
X69477000Y-74959380D01*
X69238904Y-74959380D01*
X70762714Y-74959380D02*
X70191285Y-74959380D01*
X70477000Y-74959380D02*
X70477000Y-73959380D01*
X70381761Y-74102238D01*
X70286523Y-74197476D01*
X70191285Y-74245095D01*
X49077714Y-74350571D02*
X49220571Y-74398190D01*
X49268190Y-74445809D01*
X49315809Y-74541047D01*
X49315809Y-74683904D01*
X49268190Y-74779142D01*
X49220571Y-74826761D01*
X49125333Y-74874380D01*
X48744380Y-74874380D01*
X48744380Y-73874380D01*
X49077714Y-73874380D01*
X49172952Y-73922000D01*
X49220571Y-73969619D01*
X49268190Y-74064857D01*
X49268190Y-74160095D01*
X49220571Y-74255333D01*
X49172952Y-74302952D01*
X49077714Y-74350571D01*
X48744380Y-74350571D01*
X49696761Y-74588666D02*
X50172952Y-74588666D01*
X49601523Y-74874380D02*
X49934857Y-73874380D01*
X50268190Y-74874380D01*
X50458666Y-73874380D02*
X51030095Y-73874380D01*
X50744380Y-74874380D02*
X50744380Y-73874380D01*
X51887238Y-74874380D02*
X51315809Y-74874380D01*
X51601523Y-74874380D02*
X51601523Y-73874380D01*
X51506285Y-74017238D01*
X51411047Y-74112476D01*
X51315809Y-74160095D01*
X76986190Y-50331666D02*
X77462380Y-50331666D01*
X76890952Y-50617380D02*
X77224285Y-49617380D01*
X77557619Y-50617380D01*
X77748095Y-49617380D02*
X78319523Y-49617380D01*
X78033809Y-50617380D02*
X78033809Y-49617380D01*
X78510000Y-49617380D02*
X79081428Y-49617380D01*
X78795714Y-50617380D02*
X78795714Y-49617380D01*
X79414761Y-50617380D02*
X79414761Y-49950714D01*
X79414761Y-49617380D02*
X79367142Y-49665000D01*
X79414761Y-49712619D01*
X79462380Y-49665000D01*
X79414761Y-49617380D01*
X79414761Y-49712619D01*
X79890952Y-49950714D02*
X79890952Y-50617380D01*
X79890952Y-50045952D02*
X79938571Y-49998333D01*
X80033809Y-49950714D01*
X80176666Y-49950714D01*
X80271904Y-49998333D01*
X80319523Y-50093571D01*
X80319523Y-50617380D01*
X80700476Y-49950714D02*
X80938571Y-50617380D01*
X81176666Y-49950714D02*
X80938571Y-50617380D01*
X80843333Y-50855476D01*
X80795714Y-50903095D01*
X80700476Y-50950714D01*
X81700476Y-50045952D02*
X81605238Y-49998333D01*
X81557619Y-49950714D01*
X81510000Y-49855476D01*
X81510000Y-49807857D01*
X81557619Y-49712619D01*
X81605238Y-49665000D01*
X81700476Y-49617380D01*
X81890952Y-49617380D01*
X81986190Y-49665000D01*
X82033809Y-49712619D01*
X82081428Y-49807857D01*
X82081428Y-49855476D01*
X82033809Y-49950714D01*
X81986190Y-49998333D01*
X81890952Y-50045952D01*
X81700476Y-50045952D01*
X81605238Y-50093571D01*
X81557619Y-50141190D01*
X81510000Y-50236428D01*
X81510000Y-50426904D01*
X81557619Y-50522142D01*
X81605238Y-50569761D01*
X81700476Y-50617380D01*
X81890952Y-50617380D01*
X81986190Y-50569761D01*
X82033809Y-50522142D01*
X82081428Y-50426904D01*
X82081428Y-50236428D01*
X82033809Y-50141190D01*
X81986190Y-50093571D01*
X81890952Y-50045952D01*
X82938571Y-49950714D02*
X82938571Y-50617380D01*
X82700476Y-49569761D02*
X82462380Y-50284047D01*
X83081428Y-50284047D01*
X75192142Y-66873380D02*
X74858809Y-66397190D01*
X74620714Y-66873380D02*
X74620714Y-65873380D01*
X75001666Y-65873380D01*
X75096904Y-65921000D01*
X75144523Y-65968619D01*
X75192142Y-66063857D01*
X75192142Y-66206714D01*
X75144523Y-66301952D01*
X75096904Y-66349571D01*
X75001666Y-66397190D01*
X74620714Y-66397190D01*
X75954047Y-66349571D02*
X75620714Y-66349571D01*
X75620714Y-66873380D02*
X75620714Y-65873380D01*
X76096904Y-65873380D01*
X76477857Y-66873380D02*
X76477857Y-65873380D01*
X76811190Y-66587666D01*
X77144523Y-65873380D01*
X77144523Y-66873380D01*
X77668333Y-66873380D02*
X77858809Y-66873380D01*
X77954047Y-66825761D01*
X78001666Y-66778142D01*
X78096904Y-66635285D01*
X78144523Y-66444809D01*
X78144523Y-66063857D01*
X78096904Y-65968619D01*
X78049285Y-65921000D01*
X77954047Y-65873380D01*
X77763571Y-65873380D01*
X77668333Y-65921000D01*
X77620714Y-65968619D01*
X77573095Y-66063857D01*
X77573095Y-66301952D01*
X77620714Y-66397190D01*
X77668333Y-66444809D01*
X77763571Y-66492428D01*
X77954047Y-66492428D01*
X78049285Y-66444809D01*
X78096904Y-66397190D01*
X78144523Y-66301952D01*
X79049285Y-65873380D02*
X78573095Y-65873380D01*
X78525476Y-66349571D01*
X78573095Y-66301952D01*
X78668333Y-66254333D01*
X78906428Y-66254333D01*
X79001666Y-66301952D01*
X79049285Y-66349571D01*
X79096904Y-66444809D01*
X79096904Y-66682904D01*
X79049285Y-66778142D01*
X79001666Y-66825761D01*
X78906428Y-66873380D01*
X78668333Y-66873380D01*
X78573095Y-66825761D01*
X78525476Y-66778142D01*
X87915952Y-70270666D02*
X88392142Y-70270666D01*
X87820714Y-70556380D02*
X88154047Y-69556380D01*
X88487380Y-70556380D01*
X88820714Y-70556380D02*
X88820714Y-69556380D01*
X89392142Y-70556380D01*
X89392142Y-69556380D01*
X89725476Y-69556380D02*
X90296904Y-69556380D01*
X90011190Y-70556380D02*
X90011190Y-69556380D01*
X91154047Y-70556380D02*
X90582619Y-70556380D01*
X90868333Y-70556380D02*
X90868333Y-69556380D01*
X90773095Y-69699238D01*
X90677857Y-69794476D01*
X90582619Y-69842095D01*
M02*

View File

@ -0,0 +1,13 @@
M48
; DRILL file {KiCad 5.1.4} date Do 05 Sep 2019 17:58:01 CEST
; FORMAT={-:-/ absolute / inch / decimal}
; #@! TF.CreationDate,2019-09-05T17:58:01+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,5.1.4
; #@! TF.FileFunction,NonPlated,1,2,NPTH
FMAT,2
INCH
%
G90
G05
T0
M30

View File

@ -0,0 +1,51 @@
M48
; DRILL file {KiCad 5.1.4} date Do 05 Sep 2019 17:58:01 CEST
; FORMAT={-:-/ absolute / inch / decimal}
; #@! TF.CreationDate,2019-09-05T17:58:01+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,5.1.4
; #@! TF.FileFunction,Plated,1,2,PTH
FMAT,2
INCH
T1C0.0157
T2C0.0394
%
G90
G05
T1
X2.225Y-2.1
X2.65Y-3.005
X2.75Y-2.3
X2.75Y-2.85
X2.83Y-2.19
X2.955Y-2.145
X3.065Y-1.97
X3.065Y-2.94
X3.1Y-1.95
X3.1Y-2.17
X3.15Y-1.825
X3.2Y-1.825
X3.2Y-2.455
X3.25Y-1.825
X3.25Y-2.455
X3.2518Y-2.536
X3.275Y-2.775
X3.3Y-1.825
X3.3875Y-2.09
T2
X2.73Y-1.9
X2.73Y-2.0
X2.73Y-2.1
X2.83Y-1.9
X2.83Y-2.0
X2.83Y-2.1
X3.525Y-1.9
X3.525Y-2.0
X3.525Y-2.1
X3.525Y-2.2
X3.525Y-2.3
X3.525Y-2.4
X3.525Y-2.5
X3.525Y-2.6
X3.525Y-2.875
T0
M30

View File

@ -0,0 +1,251 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector_Conn_01x08_Male
#
DEF Connector_Conn_01x08_Male J 0 40 Y N 1 F N
F0 "J" 0 400 50 H V C CNN
F1 "Connector_Conn_01x08_Male" 0 -500 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S 34 -395 0 -405 1 1 6 F
S 34 -295 0 -305 1 1 6 F
S 34 -195 0 -205 1 1 6 F
S 34 -95 0 -105 1 1 6 F
S 34 5 0 -5 1 1 6 F
S 34 105 0 95 1 1 6 F
S 34 205 0 195 1 1 6 F
S 34 305 0 295 1 1 6 F
P 2 1 1 6 50 -400 34 -400 N
P 2 1 1 6 50 -300 34 -300 N
P 2 1 1 6 50 -200 34 -200 N
P 2 1 1 6 50 -100 34 -100 N
P 2 1 1 6 50 0 34 0 N
P 2 1 1 6 50 100 34 100 N
P 2 1 1 6 50 200 34 200 N
P 2 1 1 6 50 300 34 300 N
X Pin_1 1 200 300 150 L 50 50 1 1 P
X Pin_2 2 200 200 150 L 50 50 1 1 P
X Pin_3 3 200 100 150 L 50 50 1 1 P
X Pin_4 4 200 0 150 L 50 50 1 1 P
X Pin_5 5 200 -100 150 L 50 50 1 1 P
X Pin_6 6 200 -200 150 L 50 50 1 1 P
X Pin_7 7 200 -300 150 L 50 50 1 1 P
X Pin_8 8 200 -400 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_02x03_Odd_Even
#
DEF Connector_Generic_Conn_02x03_Odd_Even J 0 40 Y N 1 F N
F0 "J" 50 200 50 H V C CNN
F1 "Connector_Generic_Conn_02x03_Odd_Even" 50 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_2x??_*
$ENDFPLIST
DRAW
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 150 150 -150 1 1 10 f
S 150 -95 100 -105 1 1 6 N
S 150 5 100 -5 1 1 6 N
S 150 105 100 95 1 1 6 N
X Pin_1 1 -200 100 150 R 50 50 1 1 P
X Pin_2 2 300 100 150 L 50 50 1 1 P
X Pin_3 3 -200 0 150 R 50 50 1 1 P
X Pin_4 4 300 0 150 L 50 50 1 1 P
X Pin_5 5 -200 -100 150 R 50 50 1 1 P
X Pin_6 6 300 -100 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_Antenna
#
DEF Device_Antenna AE 0 40 N N 1 F N
F0 "AE" -75 75 50 H V R CNN
F1 "Device_Antenna" -75 0 50 H V R CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 10 0 100 0 -150 N
P 3 0 1 10 50 100 0 -100 -50 100 N
X A 1 0 -200 100 U 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Device_Battery_Cell
#
DEF Device_Battery_Cell BT 0 0 N N 1 F N
F0 "BT" 100 100 50 H V L CNN
F1 "Device_Battery_Cell" 100 0 50 H V L CNN
F2 "" 0 60 50 V I C CNN
F3 "" 0 60 50 V I C CNN
DRAW
S -90 70 90 60 0 1 0 F
S -62 47 58 27 0 1 0 F
P 2 0 1 0 0 30 0 0 N
P 2 0 1 0 0 70 0 100 N
P 2 0 1 10 20 135 60 135 N
P 2 0 1 10 40 155 40 115 N
X + 1 0 200 100 D 50 50 1 1 P
X - 2 0 -100 100 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C
#
DEF Device_C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "Device_C" 25 -100 50 H V L CNN
F2 "" 38 -150 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 50 50 1 1 P
X ~ 2 0 -150 110 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_LED
#
DEF Device_LED D 0 40 N N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "Device_LED" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
LED*
LED_SMD:*
LED_THT:*
$ENDFPLIST
DRAW
P 2 0 1 8 -50 -50 -50 50 N
P 2 0 1 0 -50 0 50 0 N
P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N
P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N
P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N
X K 1 -150 0 100 R 50 50 1 1 P
X A 2 150 0 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_R
#
DEF Device_R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "Device_R" 0 0 50 V V C CNN
F2 "" -70 0 50 V I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 50 50 1 1 P
X ~ 2 0 -150 50 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# MCU_Microchip_ATtiny_ATtiny84A-SSU
#
DEF MCU_Microchip_ATtiny_ATtiny84A-SSU U 0 20 Y Y 1 F N
F0 "U" -500 850 50 H V L BNN
F1 "MCU_Microchip_ATtiny_ATtiny84A-SSU" 100 -850 50 H V L TNN
F2 "Package_SO:SOIC-14_3.9x8.7mm_P1.27mm" 0 0 50 H I C CIN
F3 "" 0 0 50 H I C CNN
ALIAS ATtiny24-20SSU ATtiny24A-SSU ATtiny44V-10SSU ATtiny44-20SSU ATtiny44A-SSU ATtiny84V-10SSU ATtiny84-20SSU ATtiny84A-SSU
$FPLIST
SOIC*3.9x8.7mm*P1.27mm*
$ENDFPLIST
DRAW
S -500 -800 500 800 0 1 10 f
X VCC 1 0 900 100 D 50 50 1 1 W
X PA3 10 600 300 100 L 50 50 1 1 T
X PA2 11 600 400 100 L 50 50 1 1 T
X PA1 12 600 500 100 L 50 50 1 1 T
X AREF/PA0 13 600 600 100 L 50 50 1 1 T
X GND 14 0 -900 100 U 50 50 1 1 W
X XTAL1/PB0 2 600 -300 100 L 50 50 1 1 T
X XTAL2/PB1 3 600 -400 100 L 50 50 1 1 T
X ~RESET~/PB3 4 600 -600 100 L 50 50 1 1 T
X PB2 5 600 -500 100 L 50 50 1 1 T
X PA7 6 600 -100 100 L 50 50 1 1 T
X PA6 7 600 0 100 L 50 50 1 1 T
X PA5 8 600 100 100 L 50 50 1 1 T
X PA4 9 600 200 100 L 50 50 1 1 T
ENDDRAW
ENDDEF
#
# RF_Module_RFM95W-868S2
#
DEF RF_Module_RFM95W-868S2 U 0 40 Y Y 1 F N
F0 "U" -410 460 50 H V L CNN
F1 "RF_Module_RFM95W-868S2" 60 450 50 H V L CNN
F2 "" -3300 1650 50 H I C CNN
F3 "" -3300 1650 50 H I C CNN
ALIAS RFM95W-915S2 RFM96W-315S2 RFM96W-433S2 RFM97W-868S2 RFM97W-915S2 RFM98W-315S2 RFM98W-433S2 RFM69HCW
$FPLIST
HOPERF*RFM9XW*
$ENDFPLIST
DRAW
S -400 400 400 -500 0 1 10 f
X GND 1 -100 -600 100 U 50 50 1 1 W
X GND 10 100 -600 100 U 50 50 1 1 W
X DIO3 11 500 -100 100 L 50 50 1 1 B
X DIO4 12 500 0 100 L 50 50 1 1 B
X 3.3V 13 0 500 100 D 50 50 1 1 W
X DIO0 14 500 -400 100 L 50 50 1 1 B
X DIO1 15 500 -300 100 L 50 50 1 1 B
X DIO2 16 500 -200 100 L 50 50 1 1 B
X MISO 2 -500 100 100 R 50 50 1 1 O
X MOSI 3 -500 200 100 R 50 50 1 1 I
X SCK 4 -500 300 100 R 50 50 1 1 I
X NSS 5 -500 0 100 R 50 50 1 1 I
X RESET 6 -500 -200 100 R 50 50 1 1 B
X DIO5 7 500 100 100 L 50 50 1 1 B
X GND 8 0 -600 100 U 50 50 1 1 W
X ANT 9 500 300 100 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
# power_+3V3
#
DEF power_+3V3 #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+3V3" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS +3.3V
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +3V3 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

File diff suppressed because it is too large Load Diff

285
PCB_SMD/LORA_ATTINY84.net Normal file
View File

@ -0,0 +1,285 @@
(export (version D)
(design
(source /data/Git/IOT/LORA_ATTINY84/LORA_ATTINY84.sch)
(date "Mi 28 Aug 2019 10:33:34 CEST")
(tool "Eeschema 5.1.4")
(sheet (number 1) (name /) (tstamps /)
(title_block
(title)
(company)
(rev)
(date)
(source LORA_ATTINY84.sch)
(comment (number 1) (value ""))
(comment (number 2) (value ""))
(comment (number 3) (value ""))
(comment (number 4) (value "")))))
(components
(comp (ref U1)
(value ATtiny84A-SSU)
(footprint Package_SO:SOIC-14_3.9x8.7mm_P1.27mm)
(datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/doc8183.pdf)
(libsource (lib MCU_Microchip_ATtiny) (part ATtiny84A-SSU) (description "20MHz, 8kB Flash, 512B SRAM, 512B EEPROM, debugWIRE, SOIC-14"))
(sheetpath (names /) (tstamps /))
(tstamp 5D66342E))
(comp (ref J1)
(value Sensor)
(footprint Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical)
(datasheet ~)
(libsource (lib Connector) (part Conn_01x08_Male) (description "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)"))
(sheetpath (names /) (tstamps /))
(tstamp 5D68DC89))
(comp (ref AE1)
(value Antenna)
(footprint Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Horizontal)
(datasheet ~)
(libsource (lib Device) (part Antenna) (description Antenna))
(sheetpath (names /) (tstamps /))
(tstamp 5D699DFD))
(comp (ref C2)
(value 100n)
(footprint Capacitor_SMD:C_1206_3216Metric_Pad1.42x1.75mm_HandSolder)
(datasheet ~)
(libsource (lib Device) (part C) (description "Unpolarized capacitor"))
(sheetpath (names /) (tstamps /))
(tstamp 5D6B1612))
(comp (ref C1)
(value 100n)
(footprint Capacitor_SMD:C_1206_3216Metric_Pad1.42x1.75mm_HandSolder)
(datasheet ~)
(libsource (lib Device) (part C) (description "Unpolarized capacitor"))
(sheetpath (names /) (tstamps /))
(tstamp 5D6B2940))
(comp (ref J2)
(value PRG)
(footprint Connector_PinSocket_2.54mm:PinSocket_2x03_P2.54mm_Vertical)
(datasheet ~)
(libsource (lib Connector_Generic) (part Conn_02x03_Odd_Even) (description "Generic connector, double row, 02x03, odd/even pin numbering scheme (row 1 odd numbers, row 2 even numbers), script generated (kicad-library-utils/schlib/autogen/connector/)"))
(sheetpath (names /) (tstamps /))
(tstamp 5D69C5BF))
(comp (ref BT1)
(value Battery_Cell)
(footprint Battery:BatteryHolder_Keystone_1060_1x2032)
(datasheet ~)
(libsource (lib Device) (part Battery_Cell) (description "Single-cell battery"))
(sheetpath (names /) (tstamps /))
(tstamp 5D6F40EE))
(comp (ref U2)
(value RFM95W-868S2)
(footprint RFM9X:RFM9X-TH)
(datasheet https://www.hoperf.com/data/upload/portal/20181127/5bfcbea20e9ef.pdf)
(libsource (lib RF_Module) (part RFM95W-868S2) (description "Low power long range transceiver module, SPI and parallel interface, 868 MHz, spreading factor 6 to12, bandwith 7.8 to 500kHz, -111 to -148 dBm, SMD-16, DIP-16"))
(sheetpath (names /) (tstamps /))
(tstamp 5D664943)))
(libparts
(libpart (lib Connector) (part Conn_01x08_Male)
(description "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)")
(docs ~)
(footprints
(fp Connector*:*_1x??_*))
(fields
(field (name Reference) J)
(field (name Value) Conn_01x08_Male))
(pins
(pin (num 1) (name Pin_1) (type passive))
(pin (num 2) (name Pin_2) (type passive))
(pin (num 3) (name Pin_3) (type passive))
(pin (num 4) (name Pin_4) (type passive))
(pin (num 5) (name Pin_5) (type passive))
(pin (num 6) (name Pin_6) (type passive))
(pin (num 7) (name Pin_7) (type passive))
(pin (num 8) (name Pin_8) (type passive))))
(libpart (lib Connector_Generic) (part Conn_02x03_Odd_Even)
(description "Generic connector, double row, 02x03, odd/even pin numbering scheme (row 1 odd numbers, row 2 even numbers), script generated (kicad-library-utils/schlib/autogen/connector/)")
(docs ~)
(footprints
(fp Connector*:*_2x??_*))
(fields
(field (name Reference) J)
(field (name Value) Conn_02x03_Odd_Even))
(pins
(pin (num 1) (name Pin_1) (type passive))
(pin (num 2) (name Pin_2) (type passive))
(pin (num 3) (name Pin_3) (type passive))
(pin (num 4) (name Pin_4) (type passive))
(pin (num 5) (name Pin_5) (type passive))
(pin (num 6) (name Pin_6) (type passive))))
(libpart (lib Device) (part Antenna)
(description Antenna)
(docs ~)
(fields
(field (name Reference) AE)
(field (name Value) Antenna))
(pins
(pin (num 1) (name A) (type input))))
(libpart (lib Device) (part Battery_Cell)
(description "Single-cell battery")
(docs ~)
(fields
(field (name Reference) BT)
(field (name Value) Battery_Cell))
(pins
(pin (num 1) (name +) (type passive))
(pin (num 2) (name -) (type passive))))
(libpart (lib Device) (part C)
(description "Unpolarized capacitor")
(docs ~)
(footprints
(fp C_*))
(fields
(field (name Reference) C)
(field (name Value) C))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib MCU_Microchip_ATtiny) (part ATtiny24V-10SSU)
(aliases
(alias ATtiny24-20SSU)
(alias ATtiny24A-SSU)
(alias ATtiny44V-10SSU)
(alias ATtiny44-20SSU)
(alias ATtiny44A-SSU)
(alias ATtiny84V-10SSU)
(alias ATtiny84-20SSU)
(alias ATtiny84A-SSU))
(description "10MHz, 2kB Flash, 128B SRAM, 128B EEPROM, debugWIRE, SOIC-14")
(docs http://ww1.microchip.com/downloads/en/DeviceDoc/doc8006.pdf)
(footprints
(fp SOIC*3.9x8.7mm*P1.27mm*))
(fields
(field (name Reference) U)
(field (name Value) ATtiny24V-10SSU)
(field (name Footprint) Package_SO:SOIC-14_3.9x8.7mm_P1.27mm))
(pins
(pin (num 1) (name VCC) (type power_in))
(pin (num 2) (name XTAL1/PB0) (type 3state))
(pin (num 3) (name XTAL2/PB1) (type 3state))
(pin (num 4) (name ~RESET~/PB3) (type 3state))
(pin (num 5) (name PB2) (type 3state))
(pin (num 6) (name PA7) (type 3state))
(pin (num 7) (name PA6) (type 3state))
(pin (num 8) (name PA5) (type 3state))
(pin (num 9) (name PA4) (type 3state))
(pin (num 10) (name PA3) (type 3state))
(pin (num 11) (name PA2) (type 3state))
(pin (num 12) (name PA1) (type 3state))
(pin (num 13) (name AREF/PA0) (type 3state))
(pin (num 14) (name GND) (type power_in))))
(libpart (lib RF_Module) (part RFM95W-868S2)
(aliases
(alias RFM95W-915S2)
(alias RFM96W-315S2)
(alias RFM96W-433S2)
(alias RFM97W-868S2)
(alias RFM97W-915S2)
(alias RFM98W-315S2)
(alias RFM98W-433S2)
(alias RFM69HCW))
(description "Low power long range transceiver module, SPI and parallel interface, 868 MHz, spreading factor 6 to12, bandwith 7.8 to 500kHz, -111 to -148 dBm, SMD-16, DIP-16")
(docs https://www.hoperf.com/data/upload/portal/20181127/5bfcbea20e9ef.pdf)
(footprints
(fp HOPERF*RFM9XW*))
(fields
(field (name Reference) U)
(field (name Value) RFM95W-868S2))
(pins
(pin (num 1) (name GND) (type power_in))
(pin (num 2) (name MISO) (type output))
(pin (num 3) (name MOSI) (type input))
(pin (num 4) (name SCK) (type input))
(pin (num 5) (name NSS) (type input))
(pin (num 6) (name RESET) (type BiDi))
(pin (num 7) (name DIO5) (type BiDi))
(pin (num 8) (name GND) (type power_in))
(pin (num 9) (name ANT) (type BiDi))
(pin (num 10) (name GND) (type power_in))
(pin (num 11) (name DIO3) (type BiDi))
(pin (num 12) (name DIO4) (type BiDi))
(pin (num 13) (name 3.3V) (type power_in))
(pin (num 14) (name DIO0) (type BiDi))
(pin (num 15) (name DIO1) (type BiDi))
(pin (num 16) (name DIO2) (type BiDi)))))
(libraries
(library (logical Connector)
(uri /usr/share/kicad/library/Connector.lib))
(library (logical Connector_Generic)
(uri /usr/share/kicad/library/Connector_Generic.lib))
(library (logical Device)
(uri /usr/share/kicad/library/Device.lib))
(library (logical MCU_Microchip_ATtiny)
(uri /usr/share/kicad/library/MCU_Microchip_ATtiny.lib))
(library (logical RF_Module)
(uri /usr/share/kicad/library/RF_Module.lib)))
(nets
(net (code 1) (name +3V3)
(node (ref J1) (pin 8))
(node (ref BT1) (pin 1))
(node (ref U1) (pin 1))
(node (ref J2) (pin 2))
(node (ref C2) (pin 1))
(node (ref C1) (pin 2))
(node (ref U2) (pin 13)))
(net (code 2) (name GND)
(node (ref U2) (pin 1))
(node (ref U2) (pin 10))
(node (ref J1) (pin 7))
(node (ref BT1) (pin 2))
(node (ref C1) (pin 1))
(node (ref J2) (pin 6))
(node (ref C2) (pin 2))
(node (ref U1) (pin 14))
(node (ref U2) (pin 8)))
(net (code 3) (name "Net-(U2-Pad7)")
(node (ref U2) (pin 7)))
(net (code 4) (name DIO0)
(node (ref U1) (pin 2))
(node (ref U2) (pin 14)))
(net (code 5) (name "Net-(U2-Pad15)")
(node (ref U2) (pin 15)))
(net (code 6) (name "Net-(U2-Pad16)")
(node (ref U2) (pin 16)))
(net (code 7) (name NSS)
(node (ref U2) (pin 5))
(node (ref U1) (pin 3)))
(net (code 8) (name "Net-(U2-Pad6)")
(node (ref U2) (pin 6)))
(net (code 9) (name "Net-(AE1-Pad1)")
(node (ref AE1) (pin 1))
(node (ref U2) (pin 9)))
(net (code 10) (name "Net-(U2-Pad12)")
(node (ref U2) (pin 12)))
(net (code 11) (name "Net-(U2-Pad11)")
(node (ref U2) (pin 11)))
(net (code 12) (name PA3)
(node (ref U1) (pin 10))
(node (ref J1) (pin 3)))
(net (code 13) (name PA2)
(node (ref U1) (pin 11))
(node (ref J1) (pin 4)))
(net (code 14) (name PA1)
(node (ref U1) (pin 12))
(node (ref J1) (pin 5)))
(net (code 15) (name PA0)
(node (ref U1) (pin 13))
(node (ref J1) (pin 6)))
(net (code 16) (name PB2)
(node (ref J1) (pin 1))
(node (ref U1) (pin 5)))
(net (code 17) (name PA7)
(node (ref U1) (pin 6))
(node (ref J1) (pin 2)))
(net (code 19) (name MISO)
(node (ref J2) (pin 1))
(node (ref U1) (pin 8))
(node (ref U2) (pin 2)))
(net (code 20) (name SCK)
(node (ref J2) (pin 3))
(node (ref U1) (pin 9))
(node (ref U2) (pin 4)))
(net (code 21) (name MOSI)
(node (ref U1) (pin 7))
(node (ref J2) (pin 4))
(node (ref U2) (pin 3)))
(net (code 22) (name RST)
(node (ref J2) (pin 5))
(node (ref U1) (pin 4)))))

248
PCB_SMD/LORA_ATTINY84.pro Normal file
View File

@ -0,0 +1,248 @@
update=Mi 28 Aug 2019 13:17:55 CEST
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=LORA_ATTINY84.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
ViaDiameter1=0.8
ViaDrill1=0.4
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0.051
SolderMaskMinWidth=0.25
SolderPasteClearance=0
SolderPasteRatio=0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=1
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=./
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1

384
PCB_SMD/LORA_ATTINY84.sch Normal file
View File

@ -0,0 +1,384 @@
EESchema Schematic File Version 4
LIBS:LORA_ATTINY84-cache
EELAYER 30 0
EELAYER END
$Descr A4 8268 11693 portrait
encoding utf-8
Sheet 1 1
Title "TinyLora"
Date "2019-08-29"
Rev "1.1"
Comp ""
Comment1 "A ATTiny84 + RFM95W Based Lora Sensor Basenode"
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L power:GND #PWR0101
U 1 1 5D662E21
P 1900 4800
F 0 "#PWR0101" H 1900 4550 50 0001 C CNN
F 1 "GND" H 1905 4627 50 0000 C CNN
F 2 "" H 1900 4800 50 0001 C CNN
F 3 "" H 1900 4800 50 0001 C CNN
1 1900 4800
1 0 0 -1
$EndComp
$Comp
L MCU_Microchip_ATtiny:ATtiny84A-SSU ATTiny84
U 1 1 5D66342E
P 1900 3900
F 0 "ATTiny84" H 2050 4050 50 0000 R CNN
F 1 "ATtiny84A-SSU" H 2150 3900 50 0001 R CNN
F 2 "Package_SO:SOIC-14_3.9x8.7mm_P1.27mm" H 1900 3900 50 0001 C CIN
F 3 "http://ww1.microchip.com/downloads/en/DeviceDoc/doc8183.pdf" H 1900 3900 50 0001 C CNN
1 1900 3900
1 0 0 -1
$EndComp
Wire Wire Line
2250 1900 2250 1800
$Comp
L power:GND #PWR0103
U 1 1 5D68B8DB
P 2550 1800
F 0 "#PWR0103" H 2550 1550 50 0001 C CNN
F 1 "GND" H 2555 1627 50 0000 C CNN
F 2 "" H 2550 1800 50 0001 C CNN
F 3 "" H 2550 1800 50 0001 C CNN
1 2550 1800
1 0 0 -1
$EndComp
Wire Wire Line
2550 1700 2550 1800
$Comp
L Connector:Conn_01x08_Male J1
U 1 1 5D68DC89
P 3150 3300
F 0 "J1" H 3400 3750 50 0000 R CNN
F 1 "J1" H 3122 3273 50 0001 R CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical" H 3150 3300 50 0001 C CNN
F 3 "~" H 3150 3300 50 0001 C CNN
1 3150 3300
1 0 0 -1
$EndComp
Wire Wire Line
1900 2950 1900 3000
$Comp
L Device:Antenna ANT1
U 1 1 5D699DFD
P 1500 1000
F 0 "ANT1" H 1580 989 50 0000 L CNN
F 1 "Antenna" H 1580 898 50 0000 L CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" H 1500 1000 50 0001 C CNN
F 3 "~" H 1500 1000 50 0001 C CNN
1 1500 1000
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0104
U 1 1 5D6A5353
P 3800 4600
F 0 "#PWR0104" H 3800 4350 50 0001 C CNN
F 1 "GND" H 3805 4427 50 0000 C CNN
F 2 "" H 3800 4600 50 0001 C CNN
F 3 "" H 3800 4600 50 0001 C CNN
1 3800 4600
1 0 0 -1
$EndComp
Wire Wire Line
3700 4500 3800 4500
Wire Wire Line
3800 4500 3800 4600
$Comp
L Connector_Generic:Conn_02x03_Odd_Even PRG1
U 1 1 5D69C5BF
P 3400 4400
F 0 "PRG1" H 3450 4650 50 0000 C CNN
F 1 "PRG" H 3450 4626 50 0001 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Vertical" H 3400 4400 50 0001 C CNN
F 3 "~" H 3400 4400 50 0001 C CNN
1 3400 4400
1 0 0 -1
$EndComp
Text GLabel 2500 3700 2 50 Input ~ 0
SCK
Text GLabel 2500 3800 2 50 Input ~ 0
MISO
Text GLabel 2500 3900 2 50 Input ~ 0
MOSI
Text GLabel 2500 4200 2 50 Input ~ 0
DIO0
Text GLabel 2500 4300 2 50 Input ~ 0
NSS
Text GLabel 2500 4500 2 50 Input ~ 0
RST
Text GLabel 1500 2200 3 50 Input ~ 0
SCK
Text GLabel 1700 2200 3 50 Input ~ 0
MOSI
Text GLabel 1600 2200 3 50 Input ~ 0
MISO
Text GLabel 1800 2200 3 50 Input ~ 0
NSS
Text GLabel 2200 1200 1 50 Input ~ 0
DIO0
Wire Wire Line
2400 1700 2450 1700
Text GLabel 2500 3300 2 50 Input ~ 0
PA0
Text GLabel 2500 3400 2 50 Input ~ 0
PA1
Text GLabel 2500 3500 2 50 Input ~ 0
PA2
Text GLabel 2500 3600 2 50 Input ~ 0
PA3
Text GLabel 2500 4000 2 50 Input ~ 0
PA7
Text GLabel 2500 4400 2 50 Input ~ 0
PB2
Text GLabel 3350 3200 2 50 Input ~ 0
PA0
Text GLabel 3350 3300 2 50 Input ~ 0
PA1
Text GLabel 3350 3400 2 50 Input ~ 0
PA2
Text GLabel 3350 3500 2 50 Input ~ 0
PA3
Text GLabel 3350 3600 2 50 Input ~ 0
PA7
Text GLabel 3350 3700 2 50 Input ~ 0
PB2
$Comp
L power:GND #PWR0102
U 1 1 5D6F5F48
P 3250 1650
F 0 "#PWR0102" H 3250 1400 50 0001 C CNN
F 1 "GND" H 3255 1477 50 0000 C CNN
F 2 "" H 3250 1650 50 0001 C CNN
F 3 "" H 3250 1650 50 0001 C CNN
1 3250 1650
1 0 0 -1
$EndComp
$Comp
L Device:Battery_Cell BAT1
U 1 1 5D6F40EE
P 3250 1550
F 0 "BAT1" H 3368 1646 50 0000 L CNN
F 1 "Battery_Cell" H 3368 1555 50 0001 L CNN
F 2 "battery_holder:BatteryHolder_Keystone_1060_1x2032_Long_Pad" V 3250 1610 50 0001 C CNN
F 3 "~" V 3250 1610 50 0001 C CNN
1 3250 1550
1 0 0 -1
$EndComp
$Comp
L power:+3V3 #PWR0105
U 1 1 5D6F66AA
P 3250 1350
F 0 "#PWR0105" H 3250 1200 50 0001 C CNN
F 1 "+3V3" H 3265 1523 50 0000 C CNN
F 2 "" H 3250 1350 50 0001 C CNN
F 3 "" H 3250 1350 50 0001 C CNN
1 3250 1350
1 0 0 -1
$EndComp
$Comp
L power:+3V3 #PWR0106
U 1 1 5D6F6B97
P 1100 1550
F 0 "#PWR0106" H 1100 1400 50 0001 C CNN
F 1 "+3V3" H 1115 1723 50 0000 C CNN
F 2 "" H 1100 1550 50 0001 C CNN
F 3 "" H 1100 1550 50 0001 C CNN
1 1100 1550
1 0 0 -1
$EndComp
Wire Wire Line
1100 1550 1100 1700
$Comp
L power:+3V3 #PWR0107
U 1 1 5D6F753F
P 1900 2950
F 0 "#PWR0107" H 1900 2800 50 0001 C CNN
F 1 "+3V3" H 1915 3123 50 0000 C CNN
F 2 "" H 1900 2950 50 0001 C CNN
F 3 "" H 1900 2950 50 0001 C CNN
1 1900 2950
1 0 0 -1
$EndComp
$Comp
L power:+3V3 #PWR0108
U 1 1 5D6F7EE7
P 3800 4250
F 0 "#PWR0108" H 3800 4100 50 0001 C CNN
F 1 "+3V3" H 3815 4423 50 0000 C CNN
F 2 "" H 3800 4250 50 0001 C CNN
F 3 "" H 3800 4250 50 0001 C CNN
1 3800 4250
1 0 0 -1
$EndComp
Wire Wire Line
3700 4300 3800 4300
Wire Wire Line
3800 4300 3800 4250
Text GLabel 3700 4400 2 50 Input ~ 0
MOSI
Text GLabel 3200 4300 0 50 Input ~ 0
MISO
Text GLabel 3200 4400 0 50 Input ~ 0
SCK
Text GLabel 3200 4500 0 50 Input ~ 0
RST
$Comp
L power:+3V3 #PWR0109
U 1 1 5D6FB5F9
P 3650 2950
F 0 "#PWR0109" H 3650 2800 50 0001 C CNN
F 1 "+3V3" H 3650 3100 50 0000 C CNN
F 2 "" H 3650 2950 50 0001 C CNN
F 3 "" H 3650 2950 50 0001 C CNN
1 3650 2950
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0110
U 1 1 5D6FC140
P 3650 3200
F 0 "#PWR0110" H 3650 2950 50 0001 C CNN
F 1 "GND" H 3655 3027 50 0000 C CNN
F 2 "" H 3650 3200 50 0001 C CNN
F 3 "" H 3650 3200 50 0001 C CNN
1 3650 3200
1 0 0 -1
$EndComp
Wire Wire Line
2450 1700 2450 1600
Connection ~ 2450 1700
Wire Wire Line
2450 1700 2550 1700
NoConn ~ 2100 1200
NoConn ~ 2000 1200
NoConn ~ 1900 1200
NoConn ~ 1800 1200
NoConn ~ 1700 1200
NoConn ~ 2000 2200
Wire Wire Line
2400 1600 2450 1600
Wire Wire Line
2450 1800 2450 1700
Wire Wire Line
1100 1700 1300 1700
$Comp
L Device:LED D1
U 1 1 5D67F14D
P 3600 2450
F 0 "D1" H 3600 2200 50 0000 C CNN
F 1 "LED" H 3600 2300 50 0000 C CNN
F 2 "LED_SMD:LED_1206_3216Metric_Pad1.42x1.75mm_HandSolder" H 3600 2450 50 0001 C CNN
F 3 "~" H 3600 2450 50 0001 C CNN
1 3600 2450
-1 0 0 1
$EndComp
$Comp
L power:GND #PWR0111
U 1 1 5D67F99A
P 3850 2550
F 0 "#PWR0111" H 3850 2300 50 0001 C CNN
F 1 "GND" H 3855 2377 50 0000 C CNN
F 2 "" H 3850 2550 50 0001 C CNN
F 3 "" H 3850 2550 50 0001 C CNN
1 3850 2550
1 0 0 -1
$EndComp
$Comp
L Device:R R1
U 1 1 5D6827F4
P 3300 2450
F 0 "R1" V 3050 2450 50 0000 C CNN
F 1 "100" V 3150 2450 50 0000 C CNN
F 2 "Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder" V 3230 2450 50 0001 C CNN
F 3 "~" H 3300 2450 50 0001 C CNN
1 3300 2450
0 1 1 0
$EndComp
Text GLabel 3150 2450 0 50 Input ~ 0
PA7
Wire Wire Line
3750 2450 3850 2450
Wire Wire Line
3850 2450 3850 2550
Wire Wire Line
2400 1800 2450 1800
Wire Wire Line
2250 1800 2400 1800
Connection ~ 2400 1800
$Comp
L RF_Module:RFM95W-868S2 RFM95
U 1 1 5D664943
P 1800 1700
F 0 "RFM95" V 1800 1550 50 0000 L CNN
F 1 "RFM95W-868S2" V 1600 2150 50 0001 L CNN
F 2 "RFM:RFM95" H -1500 3350 50 0001 C CNN
F 3 "https://www.hoperf.com/data/upload/portal/20181127/5bfcbea20e9ef.pdf" H -1500 3350 50 0001 C CNN
1 1800 1700
0 -1 -1 0
$EndComp
$Comp
L Device:C C2
U 1 1 5D694E97
P 1100 1850
F 0 "C2" H 850 1900 50 0000 L CNN
F 1 "100n" H 800 1800 50 0000 L CNN
F 2 "Capacitor_SMD:C_1206_3216Metric_Pad1.42x1.75mm_HandSolder" H 1138 1700 50 0001 C CNN
F 3 "~" H 1100 1850 50 0001 C CNN
1 1100 1850
1 0 0 -1
$EndComp
Connection ~ 1100 1700
$Comp
L power:GND #PWR0112
U 1 1 5D6953B6
P 1100 2000
F 0 "#PWR0112" H 1100 1750 50 0001 C CNN
F 1 "GND" H 1105 1827 50 0000 C CNN
F 2 "" H 1100 2000 50 0001 C CNN
F 3 "" H 1100 2000 50 0001 C CNN
1 1100 2000
1 0 0 -1
$EndComp
$Comp
L Device:C C1
U 1 1 5D696543
P 1100 3250
F 0 "C1" H 850 3300 50 0000 L CNN
F 1 "100n" H 800 3200 50 0000 L CNN
F 2 "Capacitor_SMD:C_1206_3216Metric_Pad1.42x1.75mm_HandSolder" H 1138 3100 50 0001 C CNN
F 3 "~" H 1100 3250 50 0001 C CNN
1 1100 3250
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0113
U 1 1 5D696B3A
P 1100 3400
F 0 "#PWR0113" H 1100 3150 50 0001 C CNN
F 1 "GND" H 1105 3227 50 0000 C CNN
F 2 "" H 1100 3400 50 0001 C CNN
F 3 "" H 1100 3400 50 0001 C CNN
1 1100 3400
1 0 0 -1
$EndComp
Wire Wire Line
1900 2950 1100 2950
Wire Wire Line
1100 2950 1100 3100
Connection ~ 1900 2950
Wire Wire Line
3350 3100 3650 3100
Wire Wire Line
3650 3100 3650 3200
Wire Wire Line
3350 3000 3650 3000
Wire Wire Line
3650 3000 3650 2950
$EndSCHEMATC

3
PCB_SMD/README.md Normal file
View File

@ -0,0 +1,3 @@
# TinyLora PCB (SMD Version)
PCB for the TinyLora Sensor Node, SMD Version

72920
PCB_SMD/fp-info-cache Normal file

File diff suppressed because it is too large Load Diff

4
PCB_SMD/fp-lib-table Normal file
View File

@ -0,0 +1,4 @@
(fp_lib_table
(lib (name RFM)(type KiCad)(uri ${KIPRJMOD}/kicad_libs/RFM95)(options "")(descr ""))
(lib (name battery_holder)(type KiCad)(uri ${KIPRJMOD}/kicad_libs/battery_holder.pretty)(options "")(descr ""))
)

View File

@ -0,0 +1,20 @@
EESchema-DOCLIB Version 2.0
#
$CMP NRF24L01
D NRF24L01+
K NRF 2G4 radio module
$ENDCMP
#
$CMP RFM69HW
D RFM69HW, 868Mhz +20dBm HopeRF Wireless Transceiver, Vcc=3.3V
K RF69 868Mhz RF69 RFM69
F http://modtronicsaustralia.com/wp-content/uploads/2014/11/RFM69HW-V1.3.pdf
$ENDCMP
#
$CMP RFM95HW
D RFM95HW, LORA +20dBm HopeRF Wireless Transceiver, Vcc=3.3V
K RF95 LORA RF95 RFM95
F https://cdn-learn.adafruit.com/assets/assets/000/031/659/original/RFM95_96_97_98W.pdf?1460518717
$ENDCMP
#
#End Doc Library

View File

@ -0,0 +1,45 @@
(module RFM95 (layer F.Cu) (tedit 585E5D4C)
(fp_text reference REF** (at 2 -2) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value RFM95 (at 13.5 -1.8) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 0 15) (end 0 14.8) (layer F.SilkS) (width 0.2))
(fp_line (start 16 15) (end 0 15) (layer F.SilkS) (width 0.2))
(fp_line (start 16 14.8) (end 16 15) (layer F.SilkS) (width 0.2))
(fp_line (start 16 12.8) (end 16 13.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 10.8) (end 16 11.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 8.8) (end 16 9.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 6.8) (end 16 7.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 4.8) (end 16 5.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 2.8) (end 16 3.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 0.8) (end 16 1.2) (layer F.SilkS) (width 0.2))
(fp_line (start 16 -1) (end 16 -0.8) (layer F.SilkS) (width 0.2))
(fp_line (start 0 12.8) (end 0 13.2) (layer F.SilkS) (width 0.2))
(fp_line (start 0 -0.8) (end 0 -1) (layer F.SilkS) (width 0.2))
(fp_line (start -1 -0.8) (end 0 -0.8) (layer F.SilkS) (width 0.2))
(fp_line (start 0 1.2) (end 0 0.8) (layer F.SilkS) (width 0.2))
(fp_line (start 0 3.2) (end 0 2.8) (layer F.SilkS) (width 0.2))
(fp_line (start 0 4.8) (end 0 5.2) (layer F.SilkS) (width 0.2))
(fp_line (start 0 6.8) (end 0 7.2) (layer F.SilkS) (width 0.2))
(fp_line (start 0 8.8) (end 0 9.2) (layer F.SilkS) (width 0.2))
(fp_line (start 0 10.8) (end 0 11.2) (layer F.SilkS) (width 0.2))
(fp_line (start 0 -1) (end 16 -1) (layer F.SilkS) (width 0.2))
(pad 1 smd oval (at 0 0) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 2 smd oval (at 0 2) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 3 smd oval (at 0 4) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 4 smd oval (at 0 6) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 5 smd oval (at 0 8) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 6 smd oval (at 0 10) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 7 smd oval (at 0 12) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 8 smd oval (at 0 14) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 9 smd oval (at 16 14) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 10 smd oval (at 16 12) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 11 smd oval (at 16 10) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 12 smd oval (at 16 8) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 13 smd oval (at 16 6) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 14 smd oval (at 16 4) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 15 smd oval (at 16 2) (size 2 1) (layers F.Cu F.Paste F.Mask))
(pad 16 smd oval (at 16 0) (size 2 1) (layers F.Cu F.Paste F.Mask))
)

View File

@ -0,0 +1,86 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# NRF24L01
#
DEF NRF24L01 U 0 40 Y Y 1 F N
F0 "U" 100 250 60 H V C CNN
F1 "NRF24L01" 250 -250 60 H V C CNN
F2 "" 0 -150 60 H V C CNN
F3 "" 0 -150 60 H V C CNN
DRAW
S -250 200 250 -200 0 1 0 f
X GND 1 0 -350 150 U 40 40 1 1 W
X VCC 2 0 350 150 D 40 40 1 1 W
X CE 3 400 -100 150 L 40 40 1 1 I
X CSN 4 400 100 150 L 40 40 1 1 I
X SCK 5 -400 -100 150 R 40 40 1 1 I
X MOSI 6 -400 0 150 R 40 40 1 1 I
X MISO 7 -400 100 150 R 40 40 1 1 I
X IRQ 8 400 0 150 L 40 40 1 1 O
ENDDRAW
ENDDEF
#
# RFM69HW
#
DEF RFM69HW U 0 40 Y Y 1 F N
F0 "U" -350 250 40 H V C CNN
F1 "RFM69HW" 250 -750 40 H V C CNN
F2 "mysensors_radios:RFM69HW_SMD_ThroughHole_Handsoldering" 0 0 30 H I C CIN
F3 "" 0 0 60 H V C CNN
$FPLIST
RFM69*
$ENDFPLIST
DRAW
S -400 200 400 -700 0 1 10 f
X RESET 1 -550 -550 150 R 40 40 1 1 B
X DIO0 2 550 0 150 L 40 40 1 1 B
X DIO1 3 550 -100 150 L 40 40 1 1 B
X DIO2 4 550 -200 150 L 40 40 1 1 B
X DIO3 5 550 -300 150 L 40 40 1 1 B
X DIO4 6 550 -400 150 L 40 40 1 1 B
X DIO5 7 550 -500 150 L 40 40 1 1 B
X 3.3V 8 0 350 150 D 40 40 1 1 W
X GND 9 -100 -850 150 U 40 40 1 1 W
X ANA 10 -550 150 150 R 40 40 1 1 P
X GND 11 100 -850 150 U 40 40 1 1 W
X SCK 12 -550 -350 150 R 40 40 1 1 I
X MISO 13 -550 -250 150 R 40 40 1 1 T
X MOSI 14 -550 -150 150 R 40 40 1 1 I
X NSS 15 -550 -50 150 R 40 40 1 1 I
X NC 16 -550 -650 150 R 40 40 1 1 P
ENDDRAW
ENDDEF
#
# RFM95HW
#
DEF RFM95HW U 0 40 Y Y 1 F N
F0 "U" -350 250 40 H V C CNN
F1 "RFM95HW" 250 -750 40 H V C CNN
F2 "mysensors_radios:RFM69HW_SMD_ThroughHole_Handsoldering" 0 0 30 H I C CIN
F3 "" 0 0 60 H V C CNN
$FPLIST
RFM95*
$ENDFPLIST
DRAW
S -400 200 400 -700 0 1 10 f
X GND 1 -100 -850 150 U 40 40 1 1 W
X MISO 2 -550 -250 150 R 40 40 1 1 T
X MOSI 3 -550 -150 150 R 40 40 1 1 I
X SCK 4 -550 -350 150 R 40 40 1 1 I
X NSS 5 -550 -50 150 R 40 40 1 1 I
X RESET 6 -550 -550 150 R 40 40 1 1 B
X DIO5 7 550 -500 150 L 40 40 1 1 B
X GND 8 0 -850 150 U 40 40 1 1 W
X ANA 9 -550 150 150 R 40 40 1 1 P
X GND 10 100 -850 150 U 40 40 1 1 W
X DIO3 11 550 -300 150 L 40 40 1 1 B
X DIO4 12 550 -400 150 L 40 40 1 1 B
X 3.3V 13 0 350 150 D 40 40 1 1 W
X DIO0 14 550 0 150 L 40 40 1 1 B
X DIO1 15 550 -100 150 L 40 40 1 1 B
X DIO2 16 550 -200 150 L 40 40 1 1 B
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,76 @@
(module BatteryHolder_Keystone_1060_1x2032_Long_Pad (layer F.Cu) (tedit 5D66CD14)
(descr http://www.keyelco.com/product-pdf.cfm?p=726)
(tags "CR2032 BR2032 BatteryHolder Battery")
(attr smd)
(fp_text reference BAT (at -14.125 -5.3) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Battery_Cell (at 0 -11.75) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -12 6) (end -14 6) (layer F.SilkS) (width 0.12))
(fp_line (start -13 5) (end -13 7) (layer F.SilkS) (width 0.12))
(fp_text user BAT (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 11.5 -8.5) (end 6.5 -8.5) (layer F.CrtYd) (width 0.05))
(fp_arc (start 0 0) (end 6.5 -8.5) (angle -74.81070976) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.5 4) (end 11.5 8.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.7 4) (end 11.5 4) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.7 2.3) (end 14.7 4) (layer F.CrtYd) (width 0.05))
(fp_line (start 16.45 2.3) (end 14.7 2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start 16.45 -2.3) (end 16.45 2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.7 -2.3) (end 16.45 -2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.7 -4) (end 14.7 -2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.5 -4) (end 14.7 -4) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.5 -8.5) (end 11.5 -4) (layer F.CrtYd) (width 0.05))
(fp_line (start -11.5 -8.5) (end -6.5 -8.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -11.5 -4) (end -11.5 -8.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 -4) (end -11.5 -4) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 -2.3) (end -14.7 -4) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 -2.3) (end -16.45 -2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start -16.45 2.3) (end -16.45 -2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 2.3) (end -16.45 2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 4) (end -14.7 2.3) (layer F.CrtYd) (width 0.05))
(fp_line (start -14.7 4) (end -11.5 4) (layer F.CrtYd) (width 0.05))
(fp_line (start -11.5 4) (end -11.5 8.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -6.5 8.5) (end -11.5 8.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.5 8.5) (end 6.5 8.5) (layer F.CrtYd) (width 0.05))
(fp_arc (start 0 0) (end -6.5 8.5) (angle -74.81070976) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.35 -8.35) (end 11.35 -3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -11.35 -8.35) (end -11.35 -3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -11.35 -8.35) (end 11.35 -8.35) (layer F.SilkS) (width 0.12))
(fp_line (start 14.55 -3.85) (end 14.55 -2.3) (layer F.SilkS) (width 0.12))
(fp_line (start 11.35 -3.85) (end 14.55 -3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -14.55 -3.85) (end -14.55 -2.3) (layer F.SilkS) (width 0.12))
(fp_line (start -11.35 -3.85) (end -14.55 -3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -14.55 3.85) (end -14.55 2.3) (layer F.SilkS) (width 0.12))
(fp_line (start -11.35 3.85) (end -14.55 3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -9.55 8.35) (end -11.35 6.55) (layer F.SilkS) (width 0.12))
(fp_line (start -11.35 6.55) (end -11.35 3.85) (layer F.SilkS) (width 0.12))
(fp_line (start 11.35 8.35) (end -9.55 8.35) (layer F.SilkS) (width 0.12))
(fp_line (start 11.35 8.35) (end 11.35 3.85) (layer F.SilkS) (width 0.12))
(fp_line (start 14.55 3.85) (end 14.55 2.3) (layer F.SilkS) (width 0.12))
(fp_line (start 11.35 3.85) (end 14.55 3.85) (layer F.SilkS) (width 0.12))
(fp_line (start -9.4 8) (end -11 6.4) (layer F.Fab) (width 0.1))
(fp_line (start 14.2 -3.5) (end 11 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start 14.2 3.5) (end 14.2 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start 11 3.5) (end 14.2 3.5) (layer F.Fab) (width 0.1))
(fp_line (start -14.2 -3.5) (end -11 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start -14.2 3.5) (end -14.2 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start -11 3.5) (end -14.2 3.5) (layer F.Fab) (width 0.1))
(fp_line (start -11 6.4) (end -11 3.5) (layer F.Fab) (width 0.1))
(fp_line (start -11 -8) (end -11 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start 11 -8) (end 11 -3.5) (layer F.Fab) (width 0.1))
(fp_line (start 11 8) (end 11 3.5) (layer F.Fab) (width 0.1))
(fp_line (start 11 -8) (end -11 -8) (layer F.Fab) (width 0.1))
(fp_line (start 11 8) (end -9.4 8) (layer F.Fab) (width 0.1))
(fp_circle (center 0 0) (end -10.2 0) (layer Dwgs.User) (width 0.3))
(pad 1 smd rect (at -12.446 0 180) (size 7.1 3.6) (layers F.Cu F.Paste F.Mask))
(pad 2 smd rect (at 12.446 0 180) (size 7.1 3.6) (layers F.Cu F.Paste F.Mask))
(model ${KISYS3DMOD}/Battery.3dshapes/BatteryHolder_Keystone_1060_1x2032.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)

5
README.md Normal file
View File

@ -0,0 +1,5 @@
# TinyLoRa Sensor Node
## Overview
## In this Repository

BIN
case_back.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

BIN
case_front.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 KiB

BIN
pcb_back.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB