Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Delta-Wye
Sep 29, 2005

huhu posted:

Just kidding, have my first two questions.

Here is the first thing I'm working on:
http://www.oomlout.com/oom.php/products/ardx/circ-01

What is the purpose of the resistor in the setup? I see that it goes Pin 13 -> LED -> Resistor -> Ground.

Current through the resistor-led circuit is determined by R using Ohms Law. Ohm's Law is V = IR. The total voltage drop is 5V, but the drop across the resistor is actually 5V minus the forward voltage of the diode, if you assume an ideal diode. Rearranging to find I,
code:
V = I*R,
where V = (5 - Vf);
(5 - Vf)/R = I
A 'normal' diode usually has a forward voltage on the order of 2V or so, meaning the current is 3V/560 = 5.3 mA, roughly speaking. I wouldn't push any single pin on the microcontroller much past 40mA or so, and often times you have total current for a set of outputs (Don't know if that is the case with the arduino's microcontroller). LED brightness is related to the current through the device (although this isn't a linear relationship) so you can even experiment with some different R values and see the change. Just stay about 3.5V/30mA = 120ohms or so to stay on the safe side.

If you've taken calculus, you should recognize that as R goes to zero, I balloons to infinity. At some point a nonlinear effect is going to take over because we're dealing with nonideal components, but no guarantee that will happen before something blows up. You can see this occasionally with LED circuits, like this LED throwy: http://www.instructables.com/id/LED-Throwies/ The current is self-limiting even though the battery is connected directly to the LED without a resistor; I wouldn't count on this for your arduino board.

Do check out the Black Smoke thread though, tons of additional information in there!

(As an aside, I looked into it a bit and the arduino supposedly has symmetrical sink/source limitations which strikes me as unusual. So much for my habit of using I/O pins as low-side switches!)

huhu posted:

Also, there is a wire between 5V on the Arduino board and the + on the bread board. However, there is nothing else connected to the + and with or without this wire the light still works. What is the function of this?

Habit, probably. I'm sure it will be used later on. Most of the breadboards I use have red/black wires connecting the LR side buses together permanently because I rarely (if ever!) want them separated. I'm sure you will find the same thing and that wire will always be there regardless if you are really using it or not.

Delta-Wye fucked around with this message at 10:18 on Sep 6, 2012

Adbot
ADBOT LOVES YOU

Delta-Wye
Sep 29, 2005

Martytoof posted:

Awesome, thank you :)

That accelerometer, or a very similar one, is probably available in sparkfun's libraries. The time put into Eagle now will pay off later if you keep designing PCBs, fyi. It's a little awkward but once you get up the learning curve it can be sort of fun.

Delta-Wye
Sep 29, 2005
My experience with both Processing and Arduino makes me lean towards "learn by example". Do as many projects as possible using other people's code as a 'crutch'. By crutch I don't mean just use it whole-sale, I mean read it, understand it, and customize it to your particular needs. After a while you will have a pretty good feel for what either platform can do, what simplifying functions are available to you, etc.

That said, if you don't know C-style syntax at all, some basic programming tutorials/lessons/etc may be in order to get you up to speed so you can comfortably digest what you're seeing in other people's projects. I walked into both platforms with a strong set of programming skills and so understanding the gist of what someone else's code was doing was easy, I just had to look up the occasional library call that wasn't clear. If that is not the case for you, understanding the syntax is important to being able to reverse engineer code samples.

Delta-Wye
Sep 29, 2005

JesusDoesVegas posted:

For anyone in the same boat as me trying to follow Delta-wye's advice, I found a pretty good YouTube series that shows the process of coding various increasingly complicated projects. Search sciguy14 on YouTube (I'd post a link but I'm on my tablet).

It won't teach you to be self sufficient but it will provide insight for why code and circuits are set up the way they are, which is perhaps vital for those of us on this intro "script-kiddie" level.

Yeah, there is also the electronics aspect which is a whole other beast (and can be somewhat avoided when working in Processing). What kind of projects does the youtube channel walk you through?

Delta-Wye
Sep 29, 2005
Good questions. I'm going to jump in and answer some questions; I don't think babyeatingpsychopath would mind. Hopefully he'll chime in with some additional info as well. I'm going to cut out a bunch of chunks for brevity, but try and keep enough so you can follow along with what I'm addressing.

JesusDoesVegas posted:

It's got native USB compatibility instead of USB to serial like the older models had, so it can plug and play as any peripheral depending on what the program says.
FYI Teensys already provide this functionality. (And have for a while!) You may want to look into playing with one if you are going to do additional USB specific stuff.

JesusDoesVegas posted:

Clearly you've got quite a bit more experience with coding and microcontrollers than I do... but it seems as though your statement about the arduino's huge memory conflicts with my experience in my previous post.
The Atmega328 is an beefy microcontroller. 32KB of flash memory and 2KB of ram. As a point of comparison, I was doing a minimalist thing with a PIC12F629 - 1.75KB of flash and 128B of RAM. 128 bytes disappears pretty fast if you're not thoughtful about things.

JesusDoesVegas posted:

I found that when my code got too long it just didn't work. After commenting off large chunks (but being careful to not change any actual behavior) it worked again. This led me to believe I had a memory issue. The specific code was in the area prior to setup where I declare about 128 variables (for specific note values) and 13 maps for analog input (one for each major key, and a smooth logarithmic map for the individual grains).
Check out this page: http://www.designer2k2.at/home/arduino/49-arduino-ram-overflow.html

A halfway decent development environment should warn you that you are running out of memory resources; however, I've seen really nice packages happily compile binaries that were too big for flash and I wouldn't go as to far to call the arduino stuff "really nice". That page discusses what you may be running into, and I think there is a (relatively) easy solution.

JesusDoesVegas posted:

The 128 variables were amended down to 60, and each scale map was cut to a 4 octave range in order to both save space and enhance playability (too many octaves made finding a specific note too difficult. I went a little overboard). It works now, but I want to add functionality for an LCD screen, and I'd like to add other scale maps (augmented and diminished) so I know I'll need to find a better solution before adding MORE code.
Don't make 60 seperate variables, make an array. The array would be something like
code:
const int pitch[60] = { 
  NOTE1, 
  NOTE2, 
  etc 
};
This should store then nicely in memory, and make it easy to operate on them. You can store the current note in another number (int currentPitch) and just modify currentPitch to the current index you want. analogWrite(pitch[currentPitch]) or something to that effect. The const is important because it keeps all of these values from being copied into RAM; the pitches are never changed (is this correct?) so they don't need to go there. This would save a tremendous amount of space. The Atmega328 has a lot of flash, but RAM is a bit more limited.

JesusDoesVegas posted:

I could save space by getting rid of the variable declarations for each note and actually plugging in the note value in the map, but gently caress that would take forever and probably lead to me messing something up (though I'm not ruling this out if necessary). I've seen other people's code split up across multiple files (see Dr. Bleep's ATMEGA328 based Nebulophone - CODE ). I don't know why he does that but I assumed perhaps it was either to organize the sections of functionality or save space, or both.

I know this post is getting really long, but I figure I'll just get all of my questions out now... With the LCD screen I want to write the note value of the note currently playing. On a guitar or a piano its easy to tell what note you're playing, but on this thing I'm using a softpot as my play surface and the note maps change. Is there a way to write the variable NAME, not the variable VALUE to the LCD? If not the only option I can see is writing a giant 0 - 59 option case function, which I doubt is very efficient (though I could save space by nuking those 60 variable declarations).
I would need to look into your code a bit more, but you should be able to store all the LCD screens in a second const array, and just draw pitchLCD[currentPitch] on the LCD whenever it changes.

JesusDoesVegas posted:

Last question - do comments take up space at all? I know they aren't executed, but should I delete them out completely to save space, or are they just not uploaded at all?
The code you write is compiled into assembly, and turned into machine code. Each variable you declare (each int, float, char, etc) takes RAM, and each instruction takes flash, roughly speaking. Some C lines turn into more than one instruction depending on the hardware. Something like "var = var + 1;" is probably one instruction, other things aren't so clear (http://embeddedgurus.com/stack-overflow/2009/03/efficient-c-tips-7-fast-loops/ for example, has a discussion on how two code snippets with the same behavior take a different amount of instructions). Don't worry about the details too much yet, just be aware that comments are neither of these things, and the compiler just silently drops them.

For the love of god, don't delete them :)

JesusDoesVegas posted:

EDIT - If what I'm trying to do won't work with one board, I also considered adding another unit, one for synthesis and one for output. I'd prefer not to go that route however as it seems sloppy, and power, cost, and real estate would be come an issue.
Yup! Engineering is all about trade offs! I think you can make this work with one arduino, for what it's worth. Trying to will be very educational, at the very least. It seems like you can use some direction on what techniques would make your project work effectively; using const arrays is great if you know they even exist, but if you don't know they exist you don't know what to go look for. I wouldn't mind trying to get your project designed a bit better if you have some additional questions.

EDIT: For the record, a signed int on arduino is 2 bytes. A const array should reside in flash, and the atmega328's 32KB is enough space for over 16000 note values! Obviously, you will only be able to use a portion of this space, but you should be able to fit more than a couple octaves.

Delta-Wye fucked around with this message at 08:01 on Nov 4, 2012

Delta-Wye
Sep 29, 2005

JesusDoesVegas posted:

Delta-Wye is my new favorite poster. The array suggestion won't work for me since setting the variables was really just making things easier on me. Instead of writing out maps with strings of meaningless (to me) numbers, I could just write out the notes. About 15 minutes with find and replace, and some careful copy and pasting gets rid of the need to declare the variables, so I just bit the bullet and commented them out.

As an experiment I added 24 more scale maps (just repeated major scales but named them for diminished and pentatonic scales since that's what they will be in the future) and it only handles 32 total. That's 1 logarithmic chromatic scale for the grain pitch pots, 12 major, 12 diminished, and 7 pentatonic. Those last 5 won't fit.

Delta (or anyone else) do you know of a more concise way to map these scales? Essentially the Auduino assigns a pot to play the instrument (I'm using a softpot for playability). That pot's analog input is mapped to frequencies dictated by the currently selected scale. Here's example of one map:

code:
// Key of C ........C D E F G A B 
uint16_t majorC [29] = {   
    274, 308, 346, 366, 411, 461, 518, 
    549, 616, 691, 732, 822, 923, 1036, 
    1097, 1232, 1383, 1465, 1644, 1845, 2071, 
    2195, 2463, 2765, 2930, 3288, 3691, 4143, 4389
       }; 

uint16_t mapMajorC(uint16_t input) { 
  uint8_t value = (1023-input) / (1024/29); 
  return (majorC[value]); 
I didn't originally write this program, I'm just modifying it, but I think I understand what it's doing. The first uint16_t is declaring the map variable with 29 values (those brackets were actually empty in the original code), and then declaring what the values are. Next it tells the program to turn the analog signal with a 0 to 1023 range into 29 possibilities (incrementing the total number of possibilities by 1 to make the map a percentage of the full pot's range).

I don't think this can be done with an array, and I'm sure it takes up quite a bit of memory for each one. Could I somehow change the way I'm declaring these so they are stored in the relatively plentiful flash memory instead?

If it helps, right now when I compile the sketch it tells me "Binary sketch size: 5,168 bytes (of a 32,256 byte maximum)" which I'm assuming is talking about flash.

You need http://arduino.cc/en/Reference/PROGMEM to do this; i did some reading and I don't think just declaring the array as a const is enough :( map() should cleanup your code a bit in reference to identifying keys; it does pretty much exactly what you're already doing but looks cleaner. Something like:
code:
majorC[map(analogRead(0), 0, 1023, 0, 28)] 
maybe? You can also switch to a two dimensional array - you have an array of scales, each scale an array of notes. It would then be something like:
code:
pitch[map(analogRead(0), 0, 1023, 0, 28)][map(analogRead(1), 0, 1023, 0, 28)] 
I would look into doing a two dimensional array if I was doing what you are.

quote:

If it helps, right now when I compile the sketch it tells me "Binary sketch size: 5,168 bytes (of a 32,256 byte maximum)" which I'm assuming is talking about flash.
EDIT: That is referring to flash usage. When the program initializes, I'm pretty sure it copies the array values from flash to RAM so they can be referenced and modified if need be; in your case it would be better to keep them in flash and just reference them there.

Delta-Wye fucked around with this message at 22:59 on Nov 5, 2012

Delta-Wye
Sep 29, 2005

Jonny 290 posted:

I need to figure out a good level converter solution. I'm tired of trying to hack it with resistor dividers and everything's going 3.3.

Honestly, for a couple unidirectional signals a resistor divider/mosfet level shifter circuit is the easy way to go (https://www.sparkfun.com/products/8745).

If you have a lot of signals something like this works great, it just increases your part count: http://www.ti.com/product/sn74lvc16t245

Delta-Wye
Sep 29, 2005

valve posted:

I'm not massively familiar with the capabilities of the Arduino, but i'm looking to use one (or a similar microcontroller) for a project I have in mind. I need to read values for up to 64 ADCs (well initially i'll be building with just 8, but the final project will have 64), and then store these values and send them back out to the same number of DACs.

My plan is to drive it all serially, and develop it to have 8 chip selects, with each ADC and DAC IC having 8 devices within (the 8 chip selects bringing to total to the 64).

Is this something that the Arduino is capable of (even for the 8 channels), or do I need something with a lot more power?

(note: it's not an audio interface, it's reading data from a fader, and writing to a VCA for level control-- there is no audio)

You can use an analog mux to get more analog inputs (http://www.arduino.cc/playground/learning/4051 for example). To get 64 inputs, you could use a 4051 on each analog input - 8 inputs, 8 channels each + 3 digital inputs to select channel. Your code would set the digital lines to 000, read A0 through A7, then update those outputs. It would then scan and update 001, 010, 011, etc. As long as it sits in that loop it should be fine.

I think you could do the output with a bunch of different options, but I'm not sure if I know of the /best/ option. SPI potentiometers would be an interesting choice, but maybe a bit overkill? MCP4361502 is a quad pot chip over SPI, so you would need 16 of the chips (~1.88 isn't so bad), SPI hardware, and enough digital outputs to select the right CS pin (probably need a digital mux chip for this).

This solution would limit you to 256 steps on your output, not be able to provide much output current, and also have an update limit which is roughly 64 analogread() calls + a small bit of overhead.

Delta-Wye
Sep 29, 2005

JesusDoesVegas posted:


code:
if (thing = 1 || thing = 2) 
instead of just
code:
if (thing = 1 || 2)
Again, I'm sure these are obvious for most of you, but it took me a bit to figure out. Using the wrong syntax caused a lot of bizarre things to happen that threw me off.
:raise:
I think you want

code:
if (thing == 1 || thing == 2) {
    //do something
}
if you have a series of these, they can be done with a case as well:
code:
switch (thing)
{
case 1:
case 2: 
    //do something if == 1 or 2
    break;
case 3: 
    //do something else if == 3
    break;
case 4:
case 5:
    //do this if == 4 or 5
    break;
default: 
    //or do something by default
    break;
}

Delta-Wye
Sep 29, 2005

UberVexer posted:

Theoretically
"if(thing1== 1 || thing == 2)" is correct, assuming you have only one statement coming after it, that is
"if(thing1== 1 || thing == 2)
digitalWrite(13,1);"

It is just bad practice.
You misunderstood my point. Your previous example was doing assignments (=) instead of comparisons (==). Old programmers trick, always write your comparisons like this so the compiler will catch this typo:
code:
if (1 == thing || 2 == thing) {

}

UberVexer posted:

- Ground on AC or DC circuits have different meanings, so I will leave that alone as I don't want you to explode, I'm no expert on that.
Ground means the same thing in AC and DC circuit analysis, although for electricians they would call 'ground' 'neutral'. All voltages are relative, and ground is selected as a sensible reference point. When you do circuit analysis, you never calculate something absolute voltage, you calculate its relative voltage. For instance, imagine a two 9 volt batteries. If you analyze one battery, you would see it has a + and a - terminal, 9 volts apart. Hooking them up in various ways has the following effects:

a. Call the - terminal ground, the + becomes 9V. Conversely, if you call the + terminal ground, the - terminal becomes -9V. The 9V is relative between the two terminals, not absolute unless you pick an arbitrary zero point (ground).
b. Connect - to +, if we call the leftmost + terminal ground, it's - terminal becomes -9V. The + on the other battery is connected so it is the same (-9V) and the - terminal is 9 volts lower (-18V).
c. Here the middle terminal is ground (0V) so one battery's exposed terminal is 9V and the other is -9V. This configuration is common with things like audio, where you need a bipolar supply.
d. Here the rightmost - terminal is called ground. One battery up is 9V, and one more battery up is 18V.
Keep in mind a-d has different voltage levels, but the same circuit. The voltages contained are all relatively the same, but by changing what we call ground (0V) we change their absolute measurements.
e-g are parallel connections. In this case, you either get 9V or -9V out depending on what you call ground.

if a-d is the same, why do audio guys usually go with -9V and 9V, where something like an RC car (or power tool with a battery pack) is going to call it 18V? Audio guys need a bipolar swing for the audio signal, and calling ground 0V is mathematically convenient and means 0 signal is in the middle and conveniently halfway between the extremes. Something like an RC car is running 18V directly to the motors and calling +18V-0V for doing those calculations mathematically convenient.

The 'ground' in your house is a safety precaution and not the reference, the neutral wire is the reference point. They are usually connected together at the breaker box... blah... GFCI circuits... :words:
Long explanation for 'why is this ground and not this' but I hope it was slightly enlightening.

UberVexer posted:

- You probably have the Arduino powered by USB, which is relatively low power, try connecting to a 9-12VDC wall wart.
3 leds should be able to be ran from USB as long as the current being drawn per LED isn't unreasonable. huhu, are you not using resistors?
http://softsolder.com/2012/11/01/arduino-digital-output-drive-vs-direct-connected-leds/
It may work, but slight manufacturing differences between LEDs and pins will be accentuated. Using a current limiting resistor will help moderate any manufacturing differences.

UberVexer posted:

- Ohm's law. V=I*R where I = current, R = Resistance, and V is the voltage. So for the case of an LED you'd use
(Source Volts - LED Volts) / (Current / 1000) = Resistance
Why are you dividing current by 1000? If current is in mA, you need to multiply by 1000. Otherwise, just use it as is (V=IR) without changing it mysteriously to ( V/(I/1000)=R ).

UberVexer posted:

Building on that last point about resistors, you might find you get some weird values, if you feel lazy just pick the easiest one to purchase that is closest to your value, if you get 350 ohms, feel free to use a 330, because you can actually find them; or put them in series.
The reason for the values that were picked:
http://mightyohm.com/blog/2009/01/eia-resistor-values-explained/

Delta-Wye fucked around with this message at 07:52 on Nov 24, 2012

Delta-Wye
Sep 29, 2005

babyeatingpsychopath posted:

This is getting into the programming in c of the device more than you probably like, but "small" devices like microcontrollers need a different way of looking at things; they don't have gobs of memory or fast cores, so you, as a programmer, have to know EXACTLY how your code is going to get compiled if you want good performance.

I would argue this isn't the case for the Arduino platform at all. It has a relatively beefy processor and is sort of setup so the dev doesn't need to know what is happening under the hood. What the hell happens when you do an analogwrite? A print? Why does setting up a servo disable some of the PWM ports? Who knows, who cares?! It just works.

JesusDoesVegas posted:

Ya, if you look at my code I used ==... I just typoed here.

Mostly just taking the piss out of you. Keep an eye out for those typos though as they are easy to do and compile fine; you just get unexpected behavior. It can be a pain to figure out, especially on an embedded platform because it even looks right if you just glance at the code. I've taught a few semesters of introductory programming and its an extremely common mistake. I kind of wish gcc's -Wall option would toss warnings for assignments done in comparison blocks, if for no other reason than to make TAing easier :v:

JesusDoesVegas posted:

Would a switch be faster?

Maybe? Probably not? At this point you should be concerned with readability and maintainability over all. I doubt your project is pushing the '328 to the point a few cycles here and there matter that much.

Bad Munki posted:

It bears pointing out one other potential bonus for using switch statements that if() statements don't do as well, and many people forget: you don't have to use a break after each switch case. If you don't, it'll keep executing the other options until the switch is over or a break is hit.
Hey buddy, my example had fall through :colbert:

Delta-Wye fucked around with this message at 20:25 on Nov 26, 2012

Delta-Wye
Sep 29, 2005

JesusDoesVegas posted:

I'm using an ATtiny84 chip to run my PWM since I just don't feel like figuring out the timer issues I ran into earlier. The datasheet
(http://www.atmel.com/Images/8006s.pdf) says the operating voltage is 2.7v to 5.5v.

What is best practice with these ranges? Should I try to shoot for middle ground, say around 4v or would I be safe just giving it the same 5v I'm giving my Arduino?

Give it the same 5v as your arduino is using.

Typically there is a graph in the datasheet with safe operating clock ranges for the various speeds - I haven't looked at that particular device, but often the max clock rate is only available at higher VCC voltages (5V should be enough for max clock). Again, typically, you are more power efficient at lower clock rates and lower voltages although it takes a bit more time to get things done. Finding the sweet spot depends a lot on your workload, low power modes, etc, and isn't something you need to be worried about in your project which is probably USB or wall powered anyways.

Delta-Wye
Sep 29, 2005

huhu posted:

Time to ask some dumb questions!

What exactly is a ground? I've taken elements of electrical engineering for my mechanical engineering major and we did some circuit stuff but I feel the explanation of what a ground is was completely off. I thought all circuits had to be in a loop but supposedly thee ground can sometimes serve as a completion of the loop?

I set up some code so that 11, 12, and 13, from the Arduino would power three separate LEDs. One of them was much brighter than the other two. I tried moving the LEDs to different spots on the breadboard, changed the LEDs, and changed the Arduino to 10, 11, and 12 and still got the same thing. Thoughts?

How do you go about picking a resistor? Like in the case of 330Ω vs 10kΩ? My kit came with those two values.

Your post made me think of this article: http://spritesmods.com/?art=minimalism

Interesting read.

Delta-Wye
Sep 29, 2005

Sh4 posted:

I'm on the fence about buying a complete arduino kit for a project I have, basically I want to do a digital gauge cluster for my bike, the problem is that except the speedo, every sensor is resistance based, so is an arduino able to measure resistance or do I have to apply tension to the sensors and measure voltage changes ?
Not sure what you mean by tension, but here are some lecture notes on how to measure resistance with an ADC:
http://web.cecs.pdx.edu/~eas199/B/howto/thermistorArduino/thermistorArduino.pdf

Some of the information will need some tweaking, such as your fixed resistor and your voltage->resistance->measured quantity calculations, but using an ADC and a resistor divider is a pretty easy way to measure resistance.

Sh4 posted:

Also I would need a bunch of relays, are the arduino outputs able to drive relays ?
I wouldn't drive them directly, but you ought to be able to drive them using a mosfet or transistor. http://blog.makezine.com/2009/02/02/connecting-a-relay-to-arduino/ has a pretty good example. If you are driving more than a few (3 or 4) you may save some space and wiring by using something like an ULN2803 chip, which is basically 8 copies of that circuit in an 18-pin DIP package.

Sh4 posted:

Another problem is that LCD screens seems to use a lot of out pins is there a way to have an LCD screen and still have about 10 outputs availlable ?

What LCD screens are you looking at? There are lots of options for outputs and some of them (SPI interfaces, serial backpacks, etc) don't take that many I/O pins to drive.

Delta-Wye
Sep 29, 2005

rustybikes posted:

This is one of the options I use to reduce the LCD pin requirements to ONE. That's right - one pin to drive the LCD (through SoftwareSerial.h), and it lets you do PWM on the backlight as well. I bought 7 or 8 of these 'cos I use them with pretty much all of my 16x2 character LCDs. Anyway: https://www.sparkfun.com/products/258 - it's stupidly simple to use these, and have minimal overhead with many of the things I work on, 'cos I'm already doing SoftwareSerial for other things.

Word of warning - there are OLED versions of the 16x2 displays (Adafruit carries 'em). The OLEDs are only mostly HD44780 compatible, and won't work with the SerLCD backpack (or even the Adafruit i2c/SPI backpack).

You're looking at character displays; I'm hoping for a slick OLED graphical display :science:

Delta-Wye
Sep 29, 2005

JesusDoesVegas posted:

Next phase is figuring out how to model a case. I'm going to have it printed at Shapeways.com. I'll mave the case done in ABS, and the face in full color sandstone. The design I've come up with should work really well. I'll post video at some point.

Please do! I'd love to hear it/see it in action.

Delta-Wye
Sep 29, 2005

quote:

Because I couldn't control the steps and say that 0 would turn it 48, 1 would turn it 49, etc.

It appears you are sending characters, not numbers. ASCII '0' is decimal 48. http://www.asciitable.com/

Delta-Wye
Sep 29, 2005
That, and there are plenty of tricks to multiplex inputs and outputs to get more if you need to - shift registers, analog muxes, etc. The number of I/O pins usually isn't the limiting factor.

EDIT: ^^^^ I appreciate your :flashfap: posting style.

EDIT2: VVV I think the big thing I've seen is additional serial pins, but I don't remember what protocal. SPI bus or a second UART or something.

EDIT3: Like 4 UARTS and a bunch of other stuff.

Delta-Wye fucked around with this message at 01:47 on Jan 31, 2013

Delta-Wye
Sep 29, 2005

Aurium posted:

That's fine. For a few reasons infact.

One, this stepper driver has a current regulator. As long as you set it correctly, it's fine. This is why the input voltage can vary so much as peepsalot said.

Two, the resistance of the load and the voltage of the source determines current. The relationship is ohm's law I=V/R. If I put a 40ohm load across that power supply, it would put out .3a. If I put a 80 ohm resistor across it, it would put out .15a. If I put a 20 ohm resistance it would put out .6a. It cannot push more current though it, because the force that pushes the current is the voltage, and that's constant.

The amperage rating on a voltage power supply is the max current it can produce. So if I put a 10 ohm resistor resistor across this power supply, I would not get the expected 1.2A. I'd still only get .6A, assuming that I didn't damage it.

In short, if it's a motor rated for 12v, you can put any 12 volt supply on it, as long as it can supply at least the minimum amount of current. If you had a supply that could supply 1000A, it'd still only give .3a though that motor.

This isn't a bad summary, but it's missing a few details. Very few wallwarts are properly current limited. The rated current is a side effect of it's rated power output, and drawing too much current will usually have one of several possible effects depending on the quality of the wallwart. The voltage may start to sag, it may get incredibly hot, it may just warm up then suddenly turn off, or it may catch fire and destroy your house. Either way, staying below that current limit will keep everything happy.

As an aside, a lot of cheap wallwarts also don't provide voltage regulation. If you draw close to the rated current, you will get the expected voltage. Less than the rated current, and the voltage climbs up - ive seen a lightly loaded 12V wallwart put out 20ish volts. Pretty much the opposite of a brownout, which is what will happen with a cheap wallwart if it's over loaded. Some of them are as simple as a diode strapped to a transformer :cry:

For what you're doing, a 600mA should be okay unless you have /really/ beefy motors. The current limit on the EasyDriver can go up to 750mA so your limiting factor on driving big motors will be the power supply.

FYI, I went to look up particulars on the power supplies you were asking about and found this article explaining in detail what I was blathering about earlier. It has pictures! http://www.sparkfun.com/tutorials/103

Delta-Wye
Sep 29, 2005
I would grab some displays as they would be good practice and give you a neat interface for anything you might build. Do you have any particular projects in mind? It sounds like you have a lot of misc. parts to build oddball stuff so you ought to be well entertained. If you are worried about running out of stuff to do, bring a bunch of atmega328s, a dragon, and a copy of the datasheet and just reproduce all your projects baremetal.

Delta-Wye
Sep 29, 2005

MiNDRiVE posted:

You can remove the Arduino from the project completely and use another cheaper AVR chip for the final product. I would recommend an attiny85 for this project. It has 8 pins and 8k of flash which should be more than enough. You could use your Arduino board as the programmer for the attiny but you will have to design the ICSP circuit and do some soldering to make it permanent. If you go this route group the DIP version of the chip and you snag a 8 pin DIP socket from just about anywhere. The only other components you would need would be an external crystal and some decoupling capacitors. Hell you could even get by without the external crystal if you wanted. There are Arduino cores out there for the attiny so getting the code to work on that chip would be trivial. Hope this points you in the right direction.

http://avrprogrammers.com/attiny85bd.php
http://hlt.media.mit.edu/?p=1695

I think switching to an ATTiny will require a heavy rewrite of the code because he is relying on the Arduino framework for a lot of stuff.

Delta-Wye
Sep 29, 2005

babyeatingpsychopath posted:

How much granularity do you need? 4 steps? 32 steps? A number of tick marks on each rod and an optical sensor, and you can use literally any directional motor.

Analog servos are also really cheap and reasonably easy to drive from 5v, although modifying "thousands" to be free-running would be tedious.

You may be able to DIY a simple piston, if your rods could stand a little deflection. Your outside range of motion was 10", which would be a bit hard to do if the rods are fairly short. You'd also need to take the pistoning mechanism and rig it up into a nice solid package. Each package would each need some space too, because they are about 10" long even though they don't have to be necessarily that thick.

You say you may have thousands and I'm thinking at 10" a piece, this would be terrible idea just because of the scale of the thing. If do you end up on the low end, only moving 5" makes things much easier. The package is smaller so you can pack them in a lot tighter. The horizontal deflection is less too, so it will be easier on the rods. Conveniently, you can control the absolute position of a disk a lot easier than you can control the absolute linear position of a heavy wooden rod.

If porn has taught me anything, it's how to "move several wooden rods in and out in a horizontal linear way, like a piston".
http://i.imgur.com/Idm6IBb.jpg (softly :nsfw: picture of the mechanism)

Delta-Wye
Sep 29, 2005
Not even a comment on all of the double entendres. :downsrim:

To be honest, I was pretty sure you were making a sex toy. And I was stoked and totally ready to help with the project...

...until you said there would be many rods, several hundred to a thousand. :catstare:

Delta-Wye
Sep 29, 2005

HighHobo posted:

Hey everybody,
first time posting in this thread cause I need some opinions about a problem I am trying to solve. I'm working on a project for a client and decided to use an arduino to program an Atmega328 as the micro-controller for the project. The project uses a lots of pins already, but now I need to control an 8x32 led matrix. I only have 4 pins left to use and I could possibly have one more to use if I really need to. In my original design, I thought about using an ht1632c chip (led matrix controller), but it is a surface mount chip and I don't currently have access to all the tools I would need to use it. I've thought about a solution and would like to know your opinions. I would use 3 pins to connect to 4 8bit shift register with led drivers (4794) to control the 32 columns. I would also use the last available pin to connect to a 4-stage divide-by-8 johnson counter (4022) to control the rows and send a clock after the data has been sent to the 32 columns to switch row. I will try the design in simulation first, but I would like to know your opinions about it and if you had other alternatives idea.

e: Forgot to say I would probably use a driver array with the johnson counter for the current

By chance, are your available pins serial pins (SPI/RS232/i2c/etc)? Do you need brightness control?

Delta-Wye
Sep 29, 2005

HighHobo posted:

I can choose my available pins, I'm not using the serial pins of the arduino yet in the project. And no I don't need brightness control.

I would be tempted to take another processor and create a matrix controller, and then send the 'framebuffer' over a serial protocol. Basically, recreating the behavior and features of the ht1632c with a standalone atemga328. The chip isn't much more expensive than a dedicated IC. I have not thought through the best way to do this, but you gain a lot of pins using a coprocessor, especially if you can find a way to avoid the shift registers.

Delta-Wye
Sep 29, 2005

Sagebrush posted:

IANAEE but I'm pretty sure that a BJT transistor operating in saturation mode has no (or effectively no) voltage drop between the collector and the emitter. If there was a significant drop, any multi-transistor circuit with multiple possible signal paths (like, say, a computer) would be almost impossible to build. There will be a small drop between the base and the emitter, but you don't care about that in this case.

e: hey, check out what I found:

http://itp.nyu.edu/physcomp/Tutorials/HighCurrentLoads

I am a EE, and this guy is on the right track. I usually use MOSFETs for most things needing a switch, but you should be more than okay here with a NPN transistor. Sagebrush alluded to it, but make sure you have a resistor between the Arduino digital pin and the base pin on the transistor. When on, the voltage on the base should be ~.7V over the emitter, or .7V compared to the ground on the car when the emitter is connected there. The arduino ground will have to be connected to the car's ground, which means the 5V output on the Arduino will be fighting with that .7V base pin and something will most likely blow up - I suspect the cheap NPN will blow before your relatively expensive arduino's digital pin but the goal should be to have nothing blow up :v:

This page is a better explanation I think: http://electronicsclub.info/transistorcircuits.htm

The first section is pretty much a description of how transistors work - I glanced over it and it seems solid, but the money shot is the last schematic:


You need both resistors, and the logic within the Arduino would have to be reversed (digital high on the Arduino puts out 0V and vice versa) but that is a trivial thing in C.

Delta-Wye
Sep 29, 2005

dyne posted:

I don't, unfortunately. I think I could make one of those arduino oscilloscopes; I bought enough parts to build a few arduinos.

I wonder if it's a noisy signal or if the voltage is still too high with the resistors I used for the divider circuit.

It could be a number of things, but I wouldn't be surprised if you blew up that digital input :toot:

The arduino input should read a high at surprisingly low voltages. I haven't played with atmega chips to know off the top of my head, but I was doing some stuff with a PIC16 series chip and the 5V input switched at ~1.25V, for example. 6-7V is too high and I recommend you do something like [input] -> [10k] -> [10k] -> [arduino] -> [10k] -> [gnd]. If your input is 12-14V (based on your previous divider outputs) this should give 4-4.5V which should be alright. I'd recommend running the input through a low-pass filter to remove noise (do you know your highest input frequency?) and a diode clamp to prevent over voltage.

Really basic low-pass filter:


Zener clamp:


A zener of ~4.5-5V should be fine. Between this and a low-pass filter, you will have reasonable protection for arduino from the hellishly noisy automotive environment, including transitory voltage spikes. If you're curious about calculating some of these values, I'd be willing to help if you can produce some expected frequency ranges for your input.

Delta-Wye
Sep 29, 2005

dyne posted:

Some help would be great. The frequencies I could conceivably seen on the input side are 0 to 400 Hz (which would correspond to ~8000rpm). If it helps, I have a large selection of resistors, 22pF ceramic caps, 0.1uF and 10uF electrolytic caps, and 17V 0.5w zener diodes (and also whatever radioshack carries in store).

Probably a better post for the magic blue smoke thread, but here we go! I wish I had mathematic markup, but this will work. See http://www.electronics-tutorials.ws/filter/filter_2.html for more detail if you're curious.

400Hz is a good number, but I'll aim the low-pass filter cutoff frequency a bit higher to maintain some of the square wave shape while hopefully still removing noise. If you knew what the introduced noise looks like, you can often filter specific sources out (for instance, removing 60Hz hum from wall powered audio equipment), but whatev; I'll aim for 1KHz for explanatory purposes, someone else may want to chip in with a better recommendation. Whatever your goal frequency is though, this formula applies:
code:
f = 1 / (2*pi*R*C)
If we assume you have a 0.1uF capacitor, you can rearrange the formula to get
code:
(f * 2 * pi * C) = 1 / R
when solved using f = 1KHz and C = 0.1uF, the value R = 1.6K is found.

1.6K should be part of the E24 resistor set so hopefully you have one around. If not, you can find a simliar value and recalculate to find the corner frequency.

Your 17V zener diodes are a bit weird - I normally place diodes at the output side (nearest the arduino) instead of at the input, but that would require ~5V zener. If you use the second circuit, it should work to remove a large portion of the high frequency noise and clamp the input to no higher than 17V (zeners suck and I wouldn't be surprised if it will peak out closer to 20V by the time the zener is totally 'on'), but we can use 18V for our calculations. The RC filter relies on a fairly hefty input resistance IIRC, so I would use a pretty hefty resistor divider. The divider should be 1:3, so either 10k->30K or 1M->3M or something, with fairly high values if you have them, which will give 4.5V at 18V. Sanity check shows that 12V gives only 3V. If you are missing signals, you may have to get a little less aggressive with the divider or drop a comparator into the circuit. Hell, you can even use a MOSFET that can withstand 20Vish input on the gate and use it to switch 5V on and off.



Connect the gate (Vin) up to the output of your RC-clamp circuit, and Vdd to 5V, and the output (Vout) to your digital input. If your 5V is solid, the mosfet should provide quite a bit of protection to the rest of your circuit.

Delta-Wye fucked around with this message at 23:22 on May 23, 2013

Delta-Wye
Sep 29, 2005
Also, can the Arduino interrupt on falling and rising edges? If so, your interrupt handler can simply keep a count of edges and toggle your output every three edges. Something like this (psuedo code!)

code:
void digital_int<interupt__>() {

  static int count = 0;

  if (++count > 2) {
    output ^= output;
    count = 0;
  }

}

Delta-Wye
Sep 29, 2005

dyne posted:

-Yeah, attach interrupt is a bit confusing. So I would reference the physical pin as 2 everywhere except in the attachInterrupt()?
-I have the first digitalWrite because I thought you had to do that to activate the pull up resistor? I had figured I was getting an erratic signal on the input because the voltage was floating
-I added the freq < 400 because the output was all over the place, and at greater frequency the tachometer needle smacks around way past red line. I'll be removing that when I finally get the thing working properly.
-Thanks for the tips re:variable types. Shouldn't tachperiod be a float since I'm multiplying the period by 1.5? Or does that not matter?

You want to avoid float or floating point operations as much as possible. I think this is still the right way to do it:

code:
int pinTachOut = 3;
int pinTachIn = 0;
long tpTach = 0;
long tcTach = 0;
unsigned volatile int freq = 50;
volatile float TachPeriod = 0;

void setup() {
  pinMode(pinTachIn,INPUT);
  digitalWrite(pinTachIn,HIGH); 
  attachInterrupt(pinTachIn,pulseTach,CHANGE);
  pinMode(pinTachOut,OUTPUT);
}

void loop() {

}

void pulseTach() {

  static int count = 0;

  if (++count > 2) {
    digitalWrite(pinTachOut, !digitalRead(pinTachOut));
    count = 0;
  }
}
EDIT: Realize I forgot to change 'RISING' to 'CHANGE'. A very important detail too!

Delta-Wye fucked around with this message at 16:06 on May 24, 2013

Delta-Wye
Sep 29, 2005

TheLastManStanding posted:

- You can still use that if statement to protect over running the tach, but you always have to be careful with simple loops with pin writes since they'll often loop before the write cycle is complete and you end up a signal that's always high or low.

I thought digitalWrite was blocking on the Arduino platform? Also AnalogRead, which takes forever.

Delta-Wye
Sep 29, 2005

wolrah posted:

I've been programming for years and I still did a big :haw: grin when I first ran the blink example, then tinkered with the loop a bit and made it do random intervals. Even though I know it's still the same idea, the fact that my code on my screen makes physical things do things somehow makes it feel sort of new again.

This a 100x times. Forget crappy console applications or GUI applications, my programs drive around in a robot body :science:

Delta-Wye
Sep 29, 2005

Bad Munki posted:

What's the easiest route to get my arduino to make an http request to a server on the web somewhere with a little bit of data via url params? I'm looking at xbees and wifi shields and such, but the former seems to be more for xbee-to-xbee communication (for mesh networks) and both seem to be more geared towards a much lower level of communication than I'm after. I literally just the path of least resistance to being able to periodically hit something like http://mysite.com/logger?val=X

I like the xbee more if I can easily make it do what I want because it seems to be a more interesting module in general (and is more readily compatible with my teensy, which isn't required, but a definite plus), but if it's going to be a huge hassle software-wise, I'm less interested.

If you go xbee, you're going to need a base-station of some sort eventually - the xbee's are used for xbee-to-xbee communication. If you just have two, you can configure them to transparently act as serial ports and get wireless rs232 without additional configuration (I have two I have paired and just plug them in when needed, they store the config between powerups). If you have many, you can also configure them for mesh networking (iirc) so that all of your nodes don't need to see the base station, just one with a string of nodes connecting all the others. This is pretty nice for a distributed setup like whole-house monitoring or the like.

Eventually you'll need an ethernet or 802.11 adapter. Is there any reason you're shying away from some of the available shields? You say complexity, but if you're just doing the request and the device has an onboard tcp/ip stack, you're just sending out a series bytes that you can workout ahead of time (you can easily type up that request in telnet to see what I mean).

Ethernet: https://www.sparkfun.com/products/9026 (there is also a dedicated arduino model with the ethernet crap integrated)
Serial-to-ethernet gateway: https://www.sparkfun.com/products/9476
There are also small standalone 802.11 modules:
https://www.sparkfun.com/products/10004
https://www.sparkfun.com/products/10822 (in a xbee-like package!)

The prices don't seem outlandish.

EDIT:
Like this:

quote:

[me@My_Computer ~]$ telnet https://www.google.com 80
Trying 173.194.33.50...
Connected to https://www.google.com.
Escape character is '^]'.
GET / HTTP/1.1
host: https://www.google.com
The bold bits are what I actually typed; hitting enter twice after the host line results in the page, in all of it's text glory, being spit into my terminal. You can replace / with whatever path you want. The host bit is to assist a multi-host ip address with directing you to the right page afaik. It's a couple dozen characters, should be easy to write out and have the module send to the proper ip address.

Delta-Wye fucked around with this message at 21:53 on May 29, 2013

Delta-Wye
Sep 29, 2005

Sagebrush posted:

Not sure if this is something that's come up in the thread before, but I just discovered it and I think it's awesome. Energia is a refactoring of the Arduino IDE and toolchain to make a version that's compatible with the TI MSP430 launchpads. I haven't played with it much, but all the Arduino code I've tried so far has run seamlessly on the MSP430 after adjusting for the proper pins and such. This is a super big deal for me because I really like the MSP430 series as hardware, especially for their highly accurate internal clock and extreme low-power sleep mode, but the TI Code Composer Studio toolchain is just abysmal. Being able to just treat it like a slightly different Arduino is amazing.

Also the development kit is $10, often goes on sale for $4.30, and actually comes with two microcontrollers and a better socket than the Arduino so it's easy to program one and then drop it into another circuit (or breadboard). It even comes with a USB cable, something the current Arduinos inexplicably don't provide. Pretty sweet!

e: and it's even compatible with the Stellaris launchpad, which costs $13 and runs an 80MHz Cortex M4...I have two of those and haven't even tried programming them yet, so this is great

When you wrap the MSP430 hardware with the Arduino framework, do you lose a lot of the benefits like the low-power sleep modes? Interesting idea, but if you aren't able to take advantage of the low-power features there isn't a terrible amount of stuff in the MSP430 that is better than the competitors.

If you hate Code Composer (and you should!) I would recommend checking out CrossWorks for MSP430. It's my IDE of choice and it's a hell of a lot better than Code Composer. The integrated debug abilities are awesome.

Delta-Wye
Sep 29, 2005
Are you married to the accelerator concept? Honestly, integrating the acceleration from one axis is going to be largely useless for anything but drag-racing style movements (straight for a relatively small window of time with known beginning and end points).

I would be tempted to tap into the wiring harness and read the PWM output from the wheels.

Delta-Wye
Sep 29, 2005

JawnV6 posted:

That's exactly what I'm doing :) It's a bit of fitting the problem to the available sensing, but this should be enough to prove the concept that I'm going for. This is one of ~4 prototypes I want to have ready by early next week, so this kind of cheat is acceptable.

This video has a pretty good explanation of the problem you're facing. The presenter is a dude from invensense; I presume he is knowledgeable on the subject of IMU sensors :v:

Sensor Fusion (Watch the next couple minutes as he goes through the double integral stuff)

Delta-Wye
Sep 29, 2005

Mantle posted:

What if you bought one of those $10 ODB2 Bluetooth sensors from deal extreme and read the data from that?

gently caress bluetooth. If you wanted to go that route, get a SPI/UART/I2C->ODB converter and just talk to it directly with the arduino.

Delta-Wye
Sep 29, 2005

JawnV6 posted:

So yeah, got some decent data.

Accelorometers are garbage poo poo for idiots. I was driving the car myself, I have a video out the window, and I still can't figure out what the accel data is saying. Is there a cheap Arduino GPS module? Do I have to worry about words like 'constellation' or do they just spit (location, confidence) intervals?

Almost all (actually all?) consumer gps units spit out NEMA strings. They're easy to parse RS-232 serial data.

http://en.wikipedia.org/wiki/NMEA_0183

It's been a while since I've played with a GPS module, but I think the one I had had a few settings so you could change modes and get different data (raw data, lat/long, etc). I'm not really familiar with arduino-specific options, but GPS usually isn't terribly expensive although it sure looked that way when I was a poor-rear end student and playing with it.

Delta-Wye
Sep 29, 2005

extravadanza posted:

I wake up early to get to work (up at 5:15am, work starts at 6:30) and the sun doesn't peek above the horizon until I'm at work. I was looking at investing in one of those Phillips wakeup lights that slowly get brighter over 20 minutes or something and birds slowly start chirping louder and louder until it's your set alarm time, in which an alarm would go off to wake you up. Those things cost like $60-70! I have a perfectly good arduino uno sitting around unused which could *hopefully* do this cheaper.

I was looking at making the arduino control my bedside lamp, but it looks like buying or making dimming modules for wall outlet power is really expensive!
http://www.inmojo.com/store/inmojo-market/item/digital-ac-dimmer-module/

So, my next thought is to power some kind of low voltage LED array (I think the arduino supports 5v and 12v, maybe?). I'm not looking to light up the room, just enough to try to trick my Circadian Cycle into thinking it's morning at 5:15am so I'm not a drowsy mess in the shower and getting dressed. I'm looking to not spend more than $15-$20 bucks on this. Does it sound possible? Can an arduino uno accurately keep time on it's own through programming? I see there are clock modules available. I'm pretty much totally new to this.

Supplies I have available are Arduino, project wires, breadboard, assortment of resistors/caps etc.

The arduino will not be able to keep accurate enough time for what you're trying to do. The best solution is to get a real-time clock module (an 'rtc') and these are usually pretty easy to interface with. Something like this: https://www.sparkfun.com/products/99

To do the lights, an LED strip is pretty much the way to go.
Nonaddressable strips: https://www.sparkfun.com/products/10261
Cheap, but need 12V and three mosfets to control the brightness. Very easy to control.

Addressable strips:https://www.sparkfun.com/products/11272
Usually run off of 5V which is nice, but you won't need to address individual LEDs for what you're doing. Also, more expensive :)

Mini-LEDs: https://www.sparkfun.com/products/680
Something like this?

You can get tons of these sorts of things on eBay for cheap (straight from china baby!), I would check there if you're on a budget. But in a nutshell, that's what you need. If everything can be powered off of 5V, it would be easy to use a AC->USB adapter rated for enough current (I see 2.~A ones for sale for pretty cheap all the time) to power the whole thing.

Adbot
ADBOT LOVES YOU

Delta-Wye
Sep 29, 2005

echinopsis posted:

Yeah that's the impression I'm getting. Problem is I want to essentially "dim" the bulb to make the incubator the correct temperature. I guess I could thermostat style and switch it on and off but that's less appealing


Cool this is a good simple explanation of what I need to achieve. Saturation is only required if using as a switch right?


I don't mean to doubt you but I read on other places on the net that they basically are... After a bit of reading I can still see why AC would be an issue but yeah

An ideal mosfet is symmetrical (it's just a pinched channel between the source and drain), but the 'body diode' will conduct in one direction without control. See ye ol wikipedia http://en.wikipedia.org/wiki/Power_MOSFET#Body_diode

Some ideas;

Dimming is usually done in the digital world via PWM, but this is awkward with AC even though a resistive load like a lightbulb should react nicely*. A relay is out because the switching speed is slow and the hardware probably won't survive. A TRIAC can be used to only power the bulb during a small portion of the AC waveform; this is a typical solution in lots of commercial devices; i know this because I've had to replace a bunch of burned out triacs :iiam:. This setup works nice, but you need a zero-crossing detector and a bunch of other junk.

You could also approach the problem as a standard control problem. You have a target heat, and a measured heat, and can just make a quick bang-bang controller. If the measured heat is lower than your target, you turn the bulb on, if it's higher, you turn the bulb off. This is great, but if it's a terrarium with animals and poo poo, they probably don't want to have the light going on and off all the damned time.

Another approach would be to get rid of the AC - it's really the problem. A light bulb isn't polarity sensitive, just current sensitive. It's possible to just take the AC in, full bridge rectify it, and then treat it as a really large DC waveform. Your diodes should be standard rectifier diodes with enough current carrying capacity (60W/120V = .5A, so maybe 1A or so) and your mosfet will have to be rated for both the current and the max voltage (175V or so). There is no reason to filter or regulate it, so the part count ends up being pretty reasonable.

*I'm pretty sure the filament would be okay with this as long as the average temperature is pretty constant so you're not stressing it with constant expansion/contraction but I could be wrong.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply