├── LICENSE.md ├── LS7366R_example ├── LS7366R.cpp ├── LS7366R.h ├── LS7366R_example.ino ├── breadboard_pic.jpg └── breadboard_pic_mini.jpg ├── LS7366R_example_fritzing ├── LS7366R_double.fzz ├── LS7366R_double.png └── LS7366R_double_mini.jpg ├── README.md ├── test_LS7366R_simple_read_write └── test_LS7366R_simple_read_write.ino └── test_LS7366R_single_read └── test_LS7366R_single_read.ino /LICENSE.md: -------------------------------------------------------------------------------- 1 | Code sous licence MIT 2 | Copyright © Werdroid - Vladimir Kosmala 3 | -------------------------------------------------------------------------------- /LS7366R_example/LS7366R.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2014 Werdroid 2 | // Author Vladimir Kosmala 3 | 4 | #include "LS7366R.h" 5 | 6 | #include 7 | #include 8 | 9 | // Constructors //////////////////////////////////////////////////////////////// 10 | 11 | LS7366R::LS7366R(unsigned char _leftSelect, unsigned char _rightSelect, unsigned char mdr0_conf, unsigned char mdr1_conf) 12 | { 13 | leftSelect = _leftSelect; 14 | rightSelect = _rightSelect; 15 | 16 | pinMode(leftSelect, OUTPUT); 17 | pinMode(rightSelect, OUTPUT); 18 | SPI.begin(); 19 | 20 | digitalWrite(leftSelect, LOW); 21 | SPI.transfer(WR | MDR0); 22 | SPI.transfer(mdr0_conf); 23 | digitalWrite(leftSelect, HIGH); 24 | 25 | digitalWrite(leftSelect, LOW); 26 | SPI.transfer(WR | MDR1); 27 | SPI.transfer(mdr1_conf); 28 | digitalWrite(leftSelect, HIGH); 29 | 30 | digitalWrite(rightSelect, LOW); 31 | SPI.transfer(WR | MDR0); 32 | SPI.transfer(mdr0_conf); 33 | digitalWrite(rightSelect, HIGH); 34 | 35 | digitalWrite(rightSelect, LOW); 36 | SPI.transfer(WR | MDR1); 37 | SPI.transfer(mdr1_conf); 38 | digitalWrite(rightSelect, HIGH); 39 | 40 | reset(); 41 | } 42 | 43 | // Public Methods ////////////////////////////////////////////////////////////// 44 | 45 | void LS7366R::reset() 46 | { 47 | digitalWrite(leftSelect, LOW); 48 | digitalWrite(rightSelect, LOW); 49 | SPI.transfer(CLR | CNTR); 50 | digitalWrite(leftSelect, HIGH); 51 | digitalWrite(rightSelect, HIGH); 52 | } 53 | 54 | void LS7366R::sync() 55 | { 56 | long count; 57 | 58 | digitalWrite(leftSelect, LOW); 59 | digitalWrite(rightSelect, LOW); 60 | SPI.transfer(LOAD | OTR); 61 | digitalWrite(leftSelect, HIGH); 62 | digitalWrite(rightSelect, HIGH); 63 | 64 | digitalWrite(leftSelect, LOW); 65 | SPI.transfer(RD | OTR); 66 | count = SPI.transfer(0x00); 67 | count <<= 8; 68 | count |= SPI.transfer(0x00); 69 | count <<= 8; 70 | count |= SPI.transfer(0x00); 71 | count <<= 8; 72 | count |= SPI.transfer(0x00); 73 | digitalWrite(leftSelect, HIGH); 74 | leftValue = count; 75 | 76 | digitalWrite(rightSelect, LOW); 77 | SPI.transfer(RD | OTR); 78 | count = SPI.transfer(0x00); 79 | count <<= 8; 80 | count |= SPI.transfer(0x00); 81 | count <<= 8; 82 | count |= SPI.transfer(0x00); 83 | count <<= 8; 84 | count |= SPI.transfer(0x00); 85 | digitalWrite(rightSelect, HIGH); 86 | rightValue = count; 87 | } 88 | 89 | long LS7366R::left() 90 | { 91 | return leftValue; 92 | } 93 | 94 | long LS7366R::right() 95 | { 96 | return rightValue; 97 | } 98 | -------------------------------------------------------------------------------- /LS7366R_example/LS7366R.h: -------------------------------------------------------------------------------- 1 | // Copyright 2014 Werdroid 2 | // Author Vladimir Kosmala 3 | 4 | #ifndef LS7366R_h 5 | #define LS7366R_h 6 | 7 | #define CLR B00000000 8 | #define RD B01000000 9 | #define WR B10000000 10 | #define LOAD B11000000 11 | 12 | #define MDR0 B00001000 13 | #define MDR1 B00010000 14 | #define DTR B00011000 15 | #define CNTR B00100000 16 | #define OTR B00101000 17 | #define STR B00110000 18 | 19 | // filter factor 1 20 | // async index 21 | // no index 22 | // free-running 23 | // 4x quadrature 24 | #define MDR0_CONF B00000011 25 | 26 | // no flag 27 | // enabled 28 | // 32 bits 29 | #define MDR1_CONF B00000000 30 | 31 | class LS7366R { 32 | public: 33 | unsigned char leftSelect; 34 | unsigned char rightSelect; 35 | long leftValue; 36 | long rightValue; 37 | LS7366R(unsigned char _leftSelect, unsigned char _rightSelect, unsigned char mdr0_conf, unsigned char mdr1_conf); 38 | void reset(); 39 | void sync(); 40 | long left(); 41 | long right(); 42 | }; 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /LS7366R_example/LS7366R_example.ino: -------------------------------------------------------------------------------- 1 | // Copyright 2014 Werdroid 2 | // Author Vladimir Kosmala 3 | 4 | #include 5 | #include "LS7366R.h" 6 | 7 | LS7366R codeurs(SS, 10, MDR0_CONF, MDR1_CONF); 8 | 9 | void setup() { 10 | Serial.begin(9600); 11 | codeurs.reset(); 12 | } 13 | 14 | void loop() { 15 | codeurs.sync(); 16 | Serial.print(codeurs.left()); 17 | Serial.print(" "); 18 | Serial.print(codeurs.right()); 19 | Serial.println(); 20 | delay(100); 21 | } 22 | 23 | -------------------------------------------------------------------------------- /LS7366R_example/breadboard_pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/3f0a0a09b1525eee51a5d84270c9564bb1049039/LS7366R_example/breadboard_pic.jpg -------------------------------------------------------------------------------- /LS7366R_example/breadboard_pic_mini.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/3f0a0a09b1525eee51a5d84270c9564bb1049039/LS7366R_example/breadboard_pic_mini.jpg -------------------------------------------------------------------------------- /LS7366R_example_fritzing/LS7366R_double.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/3f0a0a09b1525eee51a5d84270c9564bb1049039/LS7366R_example_fritzing/LS7366R_double.fzz -------------------------------------------------------------------------------- /LS7366R_example_fritzing/LS7366R_double.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/3f0a0a09b1525eee51a5d84270c9564bb1049039/LS7366R_example_fritzing/LS7366R_double.png -------------------------------------------------------------------------------- /LS7366R_example_fritzing/LS7366R_double_mini.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/3f0a0a09b1525eee51a5d84270c9564bb1049039/LS7366R_example_fritzing/LS7366R_double_mini.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Arduino_LS7366R 2 | =============== 3 | 4 | Synchronous use of two LS7366R decoders on Arduino environnement. 5 | 6 | The goal is to provide an interface for reading two LS7366R at the same time without missing ticks for a robot having two wheels. 7 | The solution is to send the order LOAD for register CNTR into OTR via SPI with the two chips on slave mode, afterwards we can read each chip via OTR. 8 | 9 | By [Werdroid.fr](http://werdroid.fr) 10 | 11 | Usage 12 | ========= 13 | 14 | - Wire your components with SPI to Arduino like the photo below 15 | - Wire the two slave lines 16 | - Copy LS7366R.h and LS7366R.cpp in your project from LS7366R_example 17 | 18 | ```cpp 19 | #include 20 | #include "LS7366R.h" 21 | 22 | int slave_pin_left = 10; 23 | int slave_pin_right = 11; 24 | 25 | LS7366R encoders(slave_pin_left, slave_pin_right, MDR0_CONF, MDR1_CONF); 26 | 27 | void setup() { 28 | Serial.begin(9600); 29 | encoders.reset(); 30 | } 31 | 32 | void loop() { 33 | encoders.sync(); 34 | Serial.print(encoders.left()); 35 | Serial.print(" "); 36 | Serial.print(encoders.right()); 37 | Serial.println(); 38 | delay(100); 39 | } 40 | ``` 41 | 42 | Example 43 | ========= 44 | 45 | This example was done with an 1x Arduino Micro, 2x LS7366R, 1x oscillator 32Mhz, 1x encoder OME-A NEMICON 46 | 47 | ![Arduino LS7366R](https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/master/LS7366R_example/breadboard_pic_mini.jpg) 48 | ![Arduino LS7366R](https://raw.githubusercontent.com/werdroid/Arduino_LS7366R/master/LS7366R_example_fritzing/LS7366R_double_mini.jpg) 49 | 50 | LS7366R provided by LCI CSI and Anaheim Automation. 51 | Encoder provided by Vicatronic. 52 | 53 | License 54 | ---- 55 | 56 | MIT 57 | 58 | **Free Software, Hell Yeah!** 59 | -------------------------------------------------------------------------------- /test_LS7366R_simple_read_write/test_LS7366R_simple_read_write.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void setup() { 5 | Serial.begin(9600); 6 | SPI.begin(); 7 | pinMode(SS, OUTPUT); 8 | } 9 | 10 | void loop() { 11 | // Write 5 in register MDR0 12 | digitalWrite(SS, LOW); 13 | SPI.transfer((byte) B10001000); 14 | SPI.transfer(0x05); 15 | digitalWrite(SS, HIGH); 16 | 17 | // Read MDR0, should be 5 18 | digitalWrite(SS, LOW); 19 | Serial.print("commande: "); 20 | Serial.println((byte) B01001000, BIN); 21 | byte b = SPI.transfer((byte) B01001000); 22 | byte b1 = SPI.transfer(0x00); 23 | digitalWrite(SS, HIGH); 24 | Serial.print(b1, HEX); 25 | Serial.println(); 26 | delay(100); 27 | } 28 | -------------------------------------------------------------------------------- /test_LS7366R_single_read/test_LS7366R_single_read.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define CLR B00000000 5 | #define RD B01000000 6 | #define WR B10000000 7 | #define LOAD B11000000 8 | 9 | #define MDR0 B00001000 10 | #define MDR1 B00010000 11 | #define DTR B00011000 12 | #define CNTR B00100000 13 | #define OTR B00101000 14 | #define STR B00110000 15 | 16 | // filter factor 1 17 | // async index 18 | // no index 19 | // free-running 20 | // 4x quadrature 21 | #define MDR0_CONF B00000011 22 | 23 | // no flag 24 | // enabled 25 | // 32 bits 26 | #define MDR1_CONF B00000000 27 | 28 | void setup() { 29 | Serial.begin(9600); 30 | SPI.begin(); 31 | pinMode(SS, OUTPUT); 32 | 33 | 34 | digitalWrite(SS, LOW); 35 | SPI.transfer(WR | MDR0); 36 | SPI.transfer(MDR0_CONF); 37 | digitalWrite(SS, HIGH); 38 | 39 | digitalWrite(SS, LOW); 40 | SPI.transfer(WR | MDR1); 41 | SPI.transfer(MDR1_CONF); 42 | digitalWrite(SS, HIGH); 43 | 44 | digitalWrite(SS, LOW); 45 | SPI.transfer(CLR | CNTR); 46 | digitalWrite(SS, HIGH); 47 | } 48 | 49 | long count = 0; 50 | 51 | void loop() { 52 | digitalWrite(SS, LOW); 53 | byte b = SPI.transfer((byte) RD | CNTR); 54 | count = SPI.transfer(0x00); 55 | count <<= 8; 56 | count |= SPI.transfer(0x00); 57 | count <<= 8; 58 | count |= SPI.transfer(0x00); 59 | count <<= 8; 60 | count |= SPI.transfer(0x00); 61 | digitalWrite(SS, HIGH); 62 | Serial.print(count); 63 | Serial.println(); 64 | delay(100); 65 | } 66 | --------------------------------------------------------------------------------